Его очень распространена практика, и большое удобство, чтобы иметь возможность абстрагироваться некоторые свойства в базовых классах, так что нам не нужно будет заботиться о них, когда инстанцировании или расширения объектов. Другие классически объектно-ориентированные языки, такие как 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 или аналогичный полиполк, чтобы иметь возможность использовать синтаксис выше.
Бабель будет использовать 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;
Очевидная ошибка: почему skywalker.addToCollection (2); попробуйте добавить его собственный объект skywalker2.addToCollection (2); –
Затем вы должны добавить свойство 'collection' к самому инстанцированному объекту сразу после его создания с помощью объекта Object.create (Person)' и совместно использовать только функции для установки и получения ('addToCollection' и' setToCollection') в прототипе (объект 'Person' в этом случае) – Redu
@AliTorabi благодарит за это, но это не меняет результат, однако @Redu В моем вопросе я сказал:« Я хочу, чтобы базовый объект Person был связан с коллекцией » , Под этим я подразумеваю, что я не хочу добавлять эту коллекцию в каждый экземпляр объекта. Разве нет способа добиться этого? –