如果您==
将示例更改为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 | 直播源
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");
}
}
以上注意事项:
如果您的目标是找到Line
使用Point
对象作为其prototype
属性的函数(行)(请注意,该属性不是任何对象的原型,但它将成为通过这些函数创建的对象的原型 via new
),然后查看prototype
属性:实时复制| 直播源
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
函数属性的概念,它们是不同但相关的事物:
最好用一个例子来解释:
function Foo() {
}
Foo.prototype.bar = 42;
var f = new Foo();
console.log(f.bar); // "42"
该Foo
函数有一个名为 的属性prototype
。当我们通过 创建一个新对象时new Foo
,它会从中获取其底层原型Foo.prototype
,因此如果我们在该对象上查找一个属性并且它没有自己的副本,JavaScript 引擎会查看原型以查看它是否有一个。所以上面的最后一行有效,登录"42"
到控制台。
(* 我在上面说过,对象底层的原型不能作为对象上的任何属性访问。根据标准,JavaScript 也是如此。但是,许多引擎提供了一个非标准扩展,一个名为 的属性__proto__
,它就是这样:对象的底层原型。但这不是标准的。在标准中,您可以通过将对象传递给 来获取对象的原型Object.getPrototypeOf
,这是 ES5 的新功能。)
最后:这可能只是一个扔掉的例子,但我通常不希望Line
继承 from Point
,因为没有“是”关系(aLine
不是 a Point
)。这里通常的关系是组合,而不是继承。ALine
有 Point
s,但 aLine
不是Point
。