获取具有特定原型的所有元素?

时间:2013-05-17 21:53:25

标签: javascript prototype

我们来看这个例子:

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]);
  }
}

2 个答案:

答案 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 Pointnew 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