1

让我们看这个例子:

var Point = new function(){};

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

var line2 ....

我不想找到所有原型点的实体。我尝试了一些代码,但它不起作用:

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

2 回答 2

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 | 直播源

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 Pointand创建对象new Line

  • window在循环中的两个地方都使用过。window在一个地方但在另一个地方使用this只是令人困惑(即使在这种情况下,它们都引用同一个对象)。


如果您的目标是找到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函数属性的概念,它们是不同但相关的事物:

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

  • 当您通过调用函数创建对象new时(例如,将其用作构造函数),在调用 using 期间发生的一件事new是创建了一个新对象并为其分配了其底层原型(无法访问对象上的任何属性*) 来自构造函数的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

于 2013-05-17T21:56:44.927 回答
0

所有元素都有不同的原型,因为每个元素的原型都是 Point 的不同实例。

如果您对它们都使用相同的原型,那么您可以进行比较。否则,按照 TJ Crowder 所说的方式使用instanceof.

于 2013-05-17T21:57:54.013 回答