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

Kiv*_*ius 1 javascript prototype

我们来看这个例子:

var Point = new function(){};

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

var line2 ....
Run Code Online (Sandbox Code Playgroud)

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

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

T.J*_*der 5

如果您==将示例更改为instanceof,则它将适用于将Point对象作为其原型的所有全局变量:

for(key in window) {
  if(this[key] instanceof Point){ // <== using instanceof here
     console.log(this[key]);
  }
}
Run Code Online (Sandbox Code Playgroud)

但是你的定义中有错误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");
  }
}
Run Code Online (Sandbox Code Playgroud)

以上注释:

  • 不在new第一行.

  • 我实际上使用new Point和创建对象new Line.

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


如果您的目标是找到Line使用Point对象作为其prototype属性的函数(行)(请注意,该属性不是任何对象的原型,但它将成为通过这些函数创建的对象的原型new),然后查看prototype属性:Live Copy | 直播源

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");
  }
}
Run Code Online (Sandbox Code Playgroud)

我认为这里的问题可能是你误解了对象原型的概念和prototype函数的属性,它们是不同但相关的东西:

  • prototype函数的属性就是:函数的一个属性.

  • 当您通过调用函数来创建对象new(例如,使用它作为构造函数)时,在调用期间发生的事情之一new是创建一个新对象并分配其基础原型(不能作为来自构造函数的prototype属性的对象*)上的任何属性.

最好用一个例子来解释:

function Foo() {
}
Foo.prototype.bar = 42;

var f = new Foo();
console.log(f.bar); // "42"
Run Code Online (Sandbox Code Playgroud)

Foo函数有一个名为的属性prototype.当我们通过创建一个新对象时new Foo,它会从中获取它的底层原型Foo.prototype,因此如果我们在该对象上查找一个属性而它没有自己的副本,那么JavaScript引擎会查看原型以查看是否有一个.所以上面的最后一行工作,登录"42"到控制台.

(*我在上面说过,对象底层的原型不能作为对象的任何属性访问.根据标准,JavaScript也是如此.但是,有许多引擎提供的非标准扩展,一个叫做的属性__proto__,正是如此:对象的底层原型.但这不是标准的.在标准中,你可以通过传递对象来获得对象的原型Object.getPrototypeOf,这是ES5的新版本.)


最后:它可能只是一个抛弃的例子,但我通常不会期望Line继承Point,因为没有"是一种"关系(a Line不是a Point).这里通常的关系是构成,而不是继承.A Line Point s,但a Line不是Point.