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)
如果您==将示例更改为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.
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.