我正在努力完全理解'扩展'在javascript中是如何工作的。
这是我在谷歌上找到的一个简单的扩展功能
function extend(child, parent) {
var f = function() {}
f.prototype = parent.prototype;
var i;
for( i in parent.prototype ) {
child.prototype[i] = parent.prototype[i];
}
child.prototype.constructor = child;
child.parent = parent;
}
它有效,但我不明白“child.prototype.constructor = child”部分。没有它,该功能仍然有效。
该生产线的目的是什么?
答案 0 :(得分:2)
没有。你是在哪里找到那个东西的。它混合了两种方法:
function inherit(child, parent) {
var f = function() {}
f.prototype = parent.prototype;
child.prototype = new f();
child.prototype.constructor = child;
}
此函数创建一个直接从parent
函数的原型对象继承的新对象。它是Object.create()
的旧式同义词。有了这个,就建立了一个原型链 - child
的所有实例都从parent.prototype
继承。因为生成了一个新对象来覆盖child.prototype
,"constrcutor" property needs to be updated。
此函数只循环父对象的原型对象的所有属性,并将它们复制到子对象的原型对象上。这就是常见帮助函数extend
的作用。它不会重置子函数的“prototype”属性,但它也不会设置继承链。
function extend(child, parent) {
for (var i in parent.prototype ) {
child.prototype[i] = parent.prototype[i];
}
}
你是对的,行
child.prototype.constructor = child;
在这里毫无用处 - “构造函数”属性不可枚举,不会受extend
的影响。
此外,您的函数将子函数对象的“父”属性设置为父函数,这不是必需的:
child.parent = parent;
答案 1 :(得分:1)
在我看来,'child.prototype.constructor'是对象的基本/ vanilla实现,它允许其他对象从它扩展而不继承相同的父对象。因此,为什么在'child.parent = parent'之前声明它。
答案 2 :(得分:1)
这可能无法直接回答您的问题,但我想建议您使用John Resig的extend
实现:
它允许您创建名为init
的构造函数,如下所示:
var MyClass = Class.extend({
init: function() {
console.log("Running a constructor");
}
});
和instanciate对象像这样(正常):
var obj = new MyClass();
答案 3 :(得分:0)
此示例显示如何在javascript
中继承类var a = function(){
// class a constructor
this.a_priviligiate_var = 1;
}
a.prototype.a_public_var = 2;
var b = function(){
// class b constructor
// super call of class a constructor
// this line makes b class to inherit all privileged vars
b.prototype.constructor.call(this)
this.b_priviligiate_var = 3;
}
b.prototype.b_public_var = 4;
b.prototype = new a();
var c = new b();
定义一个claas:
var a = function(){
// class a constructor
this.a_priviligiate_var = 1;
}
a.prototype.a_public_var = 2;
定义另一个类:
var b = function(){
// class b constructor
// super call of class a constructor
// this line makes b class to inherit all privileged vars
b.prototype.constructor.call(this)
this.b_priviligiate_var = 3;
}
b.prototype.b_public_var = 4;
设置超级(父级)类。此行复制所有b.prototype
b.prototype = new a();
创建c
的实例var c = new b();