我正在玩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(); 仍然是父类继承。
请有人帮我解释一下这个场景。
答案 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。