它非常普遍的做法,很大的便利,以便能夠在抽象基類的一些屬性,這樣我們就不需要實例化或擴展對象時,關心他們。像Java這樣的其他面向對象的經典語言對我們來說也是如此,它通常被認爲是開發人員理解的更直觀的行爲。
解決這方面的問題可以通過兩種方式來實現:
1)ES6:
class Animal {
constructor(name) {
this.name = name;
this.collection = [];
}
addToCollection(x) {
this.collection.push(x);
}
printCollection() {
console.log(this.collection);
}
}
var dog = new Animal();
dog.addToCollection(1);
dog.printCollection(); // prints 1
var dog2 = new Animal();
dog2.addToCollection(2);
dog2.printCollection(); // prints 2
因爲不是所有的瀏覽器都支持ES6(大多數瀏覽器都ES6默認關閉),使用Babel或類似的polyfill可以使用上面的語法。
巴別將使用ES5效仿ES6語法類似於JavaScript的:
"use strict";
var _createClass = function() {
function defineProperties(target, props) {
for (var i = 0; i < props.length; i++) {
var descriptor = props[i];
descriptor.enumerable = descriptor.enumerable || false;
descriptor.configurable = true;
if ("value" in descriptor) descriptor.writable = true;
Object.defineProperty(target, descriptor.key, descriptor);
}
}
return function(Constructor, protoProps, staticProps) {
if (protoProps) defineProperties(Constructor.prototype, protoProps);
if (staticProps) defineProperties(Constructor, staticProps);
return Constructor;
};
}();
var Animal = function() {
function Animal(name) {
// .. some Babel Class checks here
this.name = name;
this.collection = [];
}
_createClass(Animal, [{
key: "addToCollection",
value: function addToCollection(x) {
this.collection.push(x);
}
}, {
key: "printCollection",
value: function printCollection() {
console.log(this.collection);
}
}]);
return Animal;
}();
var dog = new Animal();
dog.addToCollection(1);
dog.printCollection(); // prints 1
var dog2 = new Animal();
dog2.addToCollection(2);
dog2.printCollection(); // prints 2
2)另一種方法是使用由巴別方法的啓發ES5語法:
var Person = function() {
function Person(name) {
this.name = name;
this.collection = [];
this.addToCollection = function (x) {
this.collection.push(x);
}
this.printCollection = function() {
console.log(this.collection);
}
};
return Person;
}();
var p1 = new Person();
p1.addToCollection(1);
p1.printCollection(); // prints 1
var p2 = new Person();
p2.addToCollection(2);
p2.printCollection(); // prints 2
通過包裝構造函數Person在立即執行的函數中,我們確保每次有人實例化Person類時都會創建一個新的構造函數;
明顯的錯誤:爲什麼skywalker.addToCollection(2);嘗試添加它自己的對象skywalker2.addToCollection(2); –
然後你必須在通過Object.create(Person)實例化一個名爲'collection'的屬性,並且只共享設置和獲取它的函數('addToCollection'和'setToCollection')在原型中(在這種情況下爲'Person'對象) – Redu
@AliTorabi感謝您指出它,但這並不會改變結果 @Redu在我的問題中,我陳述了'我希望基礎對象Person關心集合' 。通過這個我的意思是,我不想將這個集合添加到每個實例化對象。沒有辦法實現這個嗎? –