我们来看这个例子:
var Point = new function(){};
var Line = function(){};
Line.prototype = new Point();
var line2 ....
我不想找到原型Point的所有实体。我尝试了一些代码,但它不起作用:
for(key in window) {
if(this[key] == Point){ // typeof is also not working.
console.log(this[key]);
}
}
答案 0 :(得分:5)
如果您将示例中的==
更改为instanceof
,则它将适用于所有以Point
对象为原型的全局变量:
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 Point
和new Line
创建对象。
我在循环中的两个位置都使用了window
。在一个地方使用window
但在另一个地方使用this
只会让人感到困惑(即使在这种情况下,它们都引用同一个对象)。
如果您的目标是找到使用Line
对象作为其Point
属性的功能(行prototype
)(请注意该属性不任何对象的原型,但它将成为通过new
)通过这些函数创建的对象的原型,然后查看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
属性就是:函数的属性。
通过new
调用函数创建对象(例如,将其用作构造函数)时,使用{调用期间发生的事情之一{1}}是创建一个新对象,并从构造函数的new
属性中为其基础原型(无法作为对象*上的任何属性访问)分配。
最好用一个例子来解释:
prototype
function Foo() {
}
Foo.prototype.bar = 42;
var f = new Foo();
console.log(f.bar); // "42"
函数有一个名为Foo
的属性。当我们通过prototype
创建一个新对象时,它从new Foo
获取它的底层原型,所以如果我们在该对象上查找一个属性而它没有自己的副本,那么JavaScript引擎会查看原型,看看它是否有一个。因此上面的最后一行有效,将Foo.prototype
记录到控制台。
(*我在上面说过,对象底层的原型不能作为对象的任何属性访问。根据标准,JavaScript也是如此。但是,有一个非标准的扩展名许多引擎提供了一个名为"42"
的属性,它正是这样:对象的底层原型。但这不是标准的。在标准中,你可以通过将对象传递给__proto__
来获取对象的原型,这是ES5的新内容。)
最后:这可能只是一个抛弃的例子,但我通常不希望Object.getPrototypeOf
继承Line
,因为没有“是一种”关系({{{ 1}}不是Point
)。这里通常的关系是组合,而不是继承。 Line
有 Point
,但Line
不是Point
。
答案 1 :(得分:0)
所有元素都有不同的原型,因为每个元素的原型都是Point的不同实例。
如果您使用相同的原型,那么您可以进行比较。否则,做T.J.克劳德说并使用instanceof
。