Я недавно был преобразован из C# er в Javascripter. У меня есть фундаментальный вопрос о том, как я должен разрабатывать свои «классы» в отношении общих свойств/методов.Javascript: правильный способ наследования свойств/методов
Ниже я хочу иметь «id» как общее свойство наряду с методами начала и остановки. Конечно. «id» будет отличаться от экземпляров MyDerivedClass. Может быть MyOtherDerivedClass, который должен быть наследован от MyBaseClass, поэтому хотел, чтобы этот «id» был общим свойством в базе. Может быть, мое мышление - это то, что мне нужно, чтобы получить право, пожалуйста, дайте мне знать, как я мог бы переделать это так, как это делается в Javascript.
var MyBaseClass = function(id){
MyBaseClass.prototype.id = id;
MyBaseClass.prototype.start = function(){
console.log('Starting item %s', this.id);
//...//
console.log('Started item %s', this.id);
};
MyBaseClass.prototype.stop = function(){
console.log('Stopping item %s', this.id);
//...//
console.log('Stopped item %s', this.id);
};
};
var MyDerivedClass = function(id){
MyDerivedClass.prototype.connected = false;
MyDerivedClass.prototype.id = id; //?????
};
inherit(MyDerivedClass, jsDialTone.common.items.DynamicItem);
// This is the inherit method
var inherit = function(child, base){
var Dummy = function(){};
Dummy.prototype = base.prototype;
child.prototype = new Dummy();
child.prototype.constructor = child;
};
var d1 = new MyDerivedClass('D1');
expect(d1.id).toBe('D1'); // passes
var d2 = new MyDerivedClass('D2');
expect(d1.id).toBe('D1'); // fails, since I modified the prototype.
Я предполагаю, что это произошло из нескольких чтений, с которыми я столкнулся, вероятно, я не получил их правильно. Но скажите, является ли этот код частью какой-либо библиотеки и пользователь этой библиотеки, var instance = Object.create (MyDerivedClass.prototype), экземпляр должен иметь свойство, называемое id или связанное ya? Или они должны фактически делать Object.create (MyDerivedClass).Я имею в виду, я думал: «id» и «connected» были похожими на «общие» для всех экземпляров, но их значения различны, но все экземпляры имеют «id». Следовательно, прототипом было место для этого. – theraneman
Использование прототипа (что бы это ни было, не обязательно F.prototype) с Object.create является правильным. Обычно не имеет смысла передавать функцию непосредственно Object.created, поскольку обычно не выполняется 'MyDerviedClass.thisIsToBeAPrototypeProperty = ..'. Object.create, возможно, более прототип-OO-ish, чем установка свойства прототипа функции, вызываемой с помощью 'new', но оказывает такое же влияние на [[prototype]] вновь созданного объекта. – user2864740
'var MyBaseClass = function (id) { this.id = id; }; ' ' var MyDerivedClass = function (id) { this.connected = false; MyBaseClass.call (this, id); }; ' ' унаследуют (MyDerivedClass, jsDialTone.common.items.DynamicItem); ' Если это будет право исправить тогда? – theraneman