0
我正在學習JavaScript中的不同繼承實現,主要遵循Stoyan Stefanov的Javascript Patterns書。繼承在CoffeeScript中的實現
現在我正在檢查Coffescript如何實現它。因此,給予父母和孩子classes
或構造函數:
class Animal
constructor: (@name) ->
move: (meters) ->
alert @name + " moved #{meters}m."
class Snake extends Animal
move: ->
alert "Slithering..."
super 5
sam = new Snake "Sammy the Python"
sam.move()
被編譯成:
var Animal, Horse, Snake, sam,
_extends = function(child, parent) {
for (var key in parent) {
if (_hasProp.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;
},
_hasProp = {}.hasOwnProperty;
Animal = (function() {
function Animal(_name) {
this.name = _name;
}
Animal.prototype.move = function(meters) {
return alert(this.name + (" moved " + meters + "m."));
};
return Animal;
})();
Snake = (function(_super) {
_extends(Snake, _super);
function Snake() {
return Snake.__super__.constructor.apply(this, arguments);
}
Snake.prototype.move = function() {
alert("Slithering...");
return Snake.__super__.move.call(this, 5);
};
return Snake;
})(Animal);
sam = new Snake("Sammy the Python");
sam.move();
正如我理解不同圖案的組合coffescript結果繼承的實現:
1.古典代理構造
在這種情況下,我們我們也復位constructor pointer
的d存儲超類參考。斯特凡諾夫如何定義'聖盃'。 有了這種模式,孩子只能繼承原型的屬性。
// the proxy function
function ctor() {
this.constructor = child;
}
ctor.prototype = parent.prototype;
child.prototype = new ctor();
child.__super__ = parent.prototype;
2.通過複製屬性
利用這種圖案的繼承我們只是一個對象的屬性複製到另一個
_hasProp = {}.hasOwnProperty;
for (var key in parent) {
if (_hasProp.call(parent, key)) child[key] = parent[key];
}
3.古典模式 - 租賃構造(或借用構造函數)
function Snake() {
return Snake.__super__.constructor.apply(this, arguments);
}
問題:
- 我的假設是否正確? coffescript編譯器是使用1 + 2 + 3嗎?
- 通過複製繼承似乎使用淺拷貝,這意味着它不檢查屬性是一個對象/數組,並開始遞歸。即使艱難的結果似乎是一個完美的深拷貝(對象/數組是副本,而不是引用)。爲什麼/怎麼樣?
- 是不是rent-a-constructor創建一個繼承的重複?複製屬性,然後再調用父構造函數?
_extends
函數是否也可用於對象而不是構造函數?
由於
我明白了,謝謝。但函數是對象,因爲我知道對象被引用複製。所以如果我們在'b'創建後''build'從'Animal'改變了''''''''''''''''''版本''將會被修改? – Leonardo 2015-02-05 16:58:11
不可以。「你不能」改變「Animal的功能'build'。你可以通過'Animal.build = function(){...}'分配一個新函數來替換它,但是這並不會修改仍然附着在Bird上的原始'build'。 – meagar 2015-02-05 16:59:00
作爲一個通用對象的屬性呢?我們可以在動物中修改它,不是嗎?在那種情況下會發生什麼事兒 – Leonardo 2015-02-05 17:01:47