-
大家好,
希望对.prototype问题提供一些小的指导。
我已经完成了SO中的所有答案,他们似乎没有涵盖这个具体问题,或者他们也没有,但我没有理解这一点。
手头的问题(和代码)
function foo(){};
foo.prototype.type = 'foo';
function bar()
{
this.prototype = foo.prototype;
}
test = new bar();
console.log(test.type); // type is undefined
问题
根据我的理解,type
的请求必须级联原型链,直到它找到foo
原型,这没有发生,显然我理解错误 - 为什么类型未定义?
我基本上试图找到一种扩展函数对象的方法,以便
new foo()
- 返回一个foo对象
new bar()
- 返回一个包含foo的所有方法和属性的bar对象。
感谢我能提供的任何帮助或参考!
答案 0 :(得分:1)
嗯,当你这样做时:
function bar()
{
this.prototype = foo.prototype;
}
您没有更改bar
对象原型,而是将新属性分配给名为bar
的{{1}}对象,该对象具有prototype
对象原型,基本上是:{{ 1}}。
然后:
foo
当然是未定义的!你永远不会定义它,你只需定义{ type: 'foo' }
属性
test = new bar();
console.log(test.type); // type is undefined
我想你想要像继承这样的想法。我建议克罗克福德的继承方式:
prototype
然后,就这样做:
console.log(test.prototype); // I have surprises for you
现在,
Function.prototype.inherits = function (Parent) {
this.prototype = new Parent();
return this;
};
希望这有帮助
答案 1 :(得分:0)
感谢您的评论和回复,将lante的答案扩展到我认为完全可以解释的情况。
JavaScript函数当然是一个对象,当您实例化一个函数对象的新实例时,创建的对象会接收该函数的原型。
例如,
var Foo = fn() {
this.ok= 'this is okay';
}
var Bar = fn(){};
Bar.prototype = new Foo(); // Bar.prototype is now a regular object, nothing fancy.
//for all intents and purposes, this is exactly like doing this :
Bar.prototype = {ok : 'this is okay'}; //just assigns an object, reduntent
var test = new Bar(); //new Bar instance
console.log(test.ok); //prints 'bar'
什么是魔术?
test
没有ok
属性,但当它被chains
称为function object's
原型并尝试在那里找到它时,如果它不能,它会一直移动直到它到达终点。
再次感谢所有答案