比方說,我有以下代碼片段。如何調用父構造函數?
function test(id) { alert(id); }
testChild.prototype = new test();
function testChild(){}
var instance = new testChild('hi');
是否有可能得到alert('hi')
?我現在得到undefined
。
比方說,我有以下代碼片段。如何調用父構造函數?
function test(id) { alert(id); }
testChild.prototype = new test();
function testChild(){}
var instance = new testChild('hi');
是否有可能得到alert('hi')
?我現在得到undefined
。
這就是你在CoffeeScript中做到這一點:
class Test
constructor: (id) -> alert(id)
class TestChild extends Test
instance = new TestChild('hi')
不,我不是開始一場聖戰。相反,我建議要看一看導致JavaScript代碼,看看子類可以如何實現:
// Function that does subclassing
var __extends = function(child, parent) {
for (var key in parent) {
if (Object.prototype.hasOwnProperty.call(parent, key)) {
child[key] = parent[key];
}
}
function ctor() { this.constructor = child; }
ctor.prototype = parent.prototype;
child.prototype = new ctor;
child.__super__ = parent.prototype;
return child;
};
// Our code
var Test, TestChild, instance;
Test = function(id) { alert(id); };
TestChild = function() {
TestChild.__super__.constructor.apply(this, arguments);
}; __extends(TestChild, Test);
instance = new TestChild('hi');
// And we get an alert
在http://jsfiddle.net/NGLMW/3/看到它在行動。
爲了保持正確,與CoffeeScript輸出相比,代碼略有修改,並且評論爲更易讀。
通過利用variable arguments和apply()方法,您可以這樣做。這個例子是fiddle。
function test(id) { alert(id); }
function testChild() {
testChild.prototype.apply(this, arguments);
alert('also doing my own stuff');
}
testChild.prototype = test;
var instance = new testChild('hi', 'unused', 'optional', 'args');
這可能是跨瀏覽器最多的解決方案,它利用了定義良好的語言標準。 –
另外請注意,這可能會被重寫爲'this .__ proto __。apply(this,arguments)',因此它更通用且可重用。另外請注意,如果使用'test.create'來定義繼承,就像在'testChild.prototype = Object.create(test.prototype);'中一樣,這似乎是一種在野外創建繼承的公認方法。 –
JS OOP ...
// parent class
var Test = function(id) {
console.log(id);
};
// child class
var TestChild = function(id) {
Test.call(this, id); // call parent constructor
};
// extend from parent class prototype
TestChild.prototype = Object.create(Test.prototype); // keeps the proto clean
TestChild.prototype.constructor = TestChild; // repair the inherited constructor
// end-use
var instance = new TestChild('foo');
謝謝,絕對是在JS中做到這一點的方式:P –
你這樣做會搞砸原型鏈。做到這一點的方式實際上更像http://js-bits.blogspot.com.au/2010/08/javascript-inheritance-done-right.html – papercowboy
@cayuu這是如何搞亂了原型鏈? – roylaurie
您已經有很多答案,但我會在ES6方式,這恕我直言是新標準的方式來做到這一點扔。
class Parent {
constructor() { alert('hi'); }
}
class Child extends Parent {
// Optionally include a constructor definition here. Leaving it
// out means the parent constructor is automatically invoked.
constructor() {
// imagine doing some custom stuff for this derived class
super(); // explicitly call parent constructor.
}
}
// Instantiate one:
var foo = new Child(); // alert: hi
+1分析和jsFiddle示例 – JCotton