gpt4 book ai didi

javascript - 获取具有特定原型(prototype)的所有元素?

转载 作者:行者123 更新时间:2023-11-30 08:52:29 26 4
gpt4 key购买 nike

让我们举个例子:

var Point = new function(){};

var Line = function(){};
Line.prototype = new Point();

var line2 ....

我不想找到原型(prototype)为 Point 的所有实体。我尝试了一些代码但它不起作用:

for(key in window) {
if(this[key] == Point){ // typeof is also not working.
console.log(this[key]);
}
}

最佳答案

如果将示例中的 == 更改为 instanceof,它将适用于所有以 Point 对象作为原型(prototype)的全局变量:

for(key in window) {
if(this[key] instanceof Point){ // <== using instanceof here
console.log(this[key]);
}
}

但是你对Point的定义有误。你不希望 new 在那里,因为稍后你将 Point 用作函数。但是 new function() { }调用该匿名函数作为构造函数并返回由 new 创建的非函数对象。

完整的工作示例:Live Copy | Live Source

var Point = function(){};

var Line = function(){};
Line.prototype = new Point();

var lineInstance = new Line();
var pointInstance = new Point();

for(key in window) {
if(window[key] instanceof Point){
console.log(key + " is 'instanceof' Point");
}
}

上面的注释:

  • 第一行没有new

  • 我实际上使用 new Pointnew Line 创建对象。

  • 我在循环的两个地方都使用了 window。在一个地方使用 window 而在另一个地方使用 this 只会让人感到困惑(尽管在这种情况下,它们都指的是同一个对象)。


如果您的目标是找到使用 Point 对象作为其 prototype 属性的函数(行 Line)(请注意,该属性是不是任何对象的原型(prototype),但它将成为通过new)的那些函数创建的对象的原型(prototype)),然后查看原型(prototype)属性:Live Copy | Live Source

for(key in window) {
if(typeof window[key] === "function" &&
window[key].prototype instanceof Point){
console.log(key + " is a function using Point as its prototype property");
}
}

我认为这里的问题可能是你误解了对象原型(prototype)的概念和函数的 prototype 属性,它们是不同但相关的东西:

  • 函数的 prototype 属性就是:函数的属性。

  • 当您通过 new 调用一个函数(例如,将其用作构造函数)来创建一个 对象 时,在使用 new 调用是创建一个新对象,并从构造函数的 prototype 属性中为其分配底层原型(prototype)(不能作为对象上的任何属性访问*)。

最好用一个例子来解释:

function Foo() {
}
Foo.prototype.bar = 42;

var f = new Foo();
console.log(f.bar); // "42"

Foo 函数有一个名为prototype 的属性。当我们通过 new Foo 创建一个新对象时,它从 Foo.prototype 获取它的底层原型(prototype),所以如果我们在该对象上查找一个属性并且它没有它自己的副本,JavaScript 引擎查看原型(prototype)以查看是否有。所以上面的最后一行有效,将 "42" 记录到控制台。

(* 我在上面说过对象底层的原型(prototype)不能作为对象的任何属性访问。根据标准,JavaScript 也是如此。但是,有一个非标准扩展许多引擎都提供了一个名为 __proto__ 的属性,它就是:对象的底层原型(prototype)。但这不是标准的。在标准中,您可以通过将对象传递给 来获取对象的原型(prototype)Object.getPrototypeOf,这是 ES5 的新功能。)


最后:这可能只是一个一次性的例子,但我通常不希望 Line 继承自 Point,因为没有“是一个"关系(Line 不是 Point)。这里通常的关系是组合,而不是继承。 线 ,但线不是

关于javascript - 获取具有特定原型(prototype)的所有元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16618478/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com