没有child.prototype = new parent()的Javascript继承;

时间:2012-01-05 08:53:12

标签: javascript prototypal-inheritance

我正在玩javascript原型链继承,我遇到了这个有趣的行为。

我有一个父类和一个子类

//class parent
function parent(param_1) {
    this.param_1 = param_1;

    this.getObjWithParam = function(val) {
        console.log(this);
        console.log("Constructor value in parent class " + this.param_1);
        console.log("tguha ----> parent,  val " + val);
    };
};

//class child
function child(param_1) {
    parent.call(this, [ param_1 ]);
};

var childObj = new child(100);
childObj.getObjWithParam(200);

我得到的输出为

**>child**
Constructor value in parent class 100
tguha ----> parent,  val 200

并且我在做什么//child.prototype = new parent(); 仍然是父类继承。

请有人帮我解释一下这个场景。

2 个答案:

答案 0 :(得分:1)

您在子构造函数中调用父构造函数。因为父构造函数设置this.getObjWithParam = function[...],所以它也会为子项设置它。请注意,这与原型无关。 通过调用parent.call(a, [...]),您可以调用父函数并将范围设置为a。这意味着对this所做的任何修改也都是a(因为它是同一个对象)。

答案 1 :(得分:1)

parent.call(this, [ param_1 ]) 

将Parent.param_1和Parent.getObjWithParam分配给childObj。这与继承无关。考虑这个表述:

var foo = {};

//class parent
function parent(param_1) {
    this.param_1 = param_1;

    this.getObjWithParam = function(val) {
        console.log(this.param_1);
        console.log(val);
    };
};

//class child
function child(param_1) {
    parent.call(foo, [ param_1 ]);
};

var childObj = new child( 'lets give foo a param_1');

console.log( typeof childObj.getObjWithParam );
// Undefined

foo.getObjWithParam();
// ["lets give foo a param_1"]

这里你将foo作为范围传递给.call(),因此属性被分配给foo。