用于对象函数扩展的javascript .prototype

时间:2014-06-04 18:45:56

标签: javascript

-
大家好, 希望对.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对象。

感谢我能提供的任何帮助或参考!

2 个答案:

答案 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原型并尝试在那里找到它时,如果它不能,它会一直移动直到它到达终点。

再次感谢所有答案