如果您==将示例更改为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 有 Points,但 aLine不是Point。