Итак, моя первая попытка попытаться объяснить, что я делаю, провалилась с треском. Я в основном копирую Object.create(), но с частными переменными.Идея наследования Javascript (часть 2)
Если вы посмотрите на принятый здесь ответ How to inherit from a class in javascript?, вы увидите Object.create как последний шаблон, который, как мне кажется, лучше подходит для прототипа Javascript (объекты забудут объекты) вместо эмуляции классического наследования (классы забудут объекты) ,
Если вы посмотрите статью Википедии о программировании на основе прототипа (http://en.wikipedia.org/wiki/Prototype-based_programming), вы можете увидеть больше того, что я имею в виду.
Недостаток объекта Object.create() заключается в том, что нет поддержки для частных членов. Это то, что я предлагаю:
Function.prototype.from = function(obj) {
function F() {this.parent = Object(obj);}
F.prototype = obj;
var out = new F();
this.apply(out);
return out;
};
Затем вы создаете объекты, как таким образом:
// Create an object
var a = function() {
var private_property = 'blue';
this.public_property = 7;
this.public_method = function() {
alert(this.public_property + ' ' + private_property);
}
}.from(null); // .from() works too, but .from(null) is more revealing
// Create a new object using 'a' as the prototype
var b = function() {
var private_property = 'red';
this.public_property = 8;
}.from(a);
// See the results
a.public_method(); // Alerts '7 blue'
b.public_method(); // Alerts '8 blue' - Parent methods use parent private variables
a.public_method = function() { alert('rabbit'); };
a.public_method(); // Alerts 'rabbit'
b.public_method(); // Alerts 'rabbit'
b.public_method = function() { alert('dog'); };
a.public_method(); // Alerts 'rabbit'
b.public_method(); // Alerts 'dog' - Parent method is overwritten
Как я сделал «от» функция такова, что, когда родительский объект изменяет свои методы, если вы хотите предотвратить изменение детского экземпляра, вы можете указать:
this.public_method = this.parent.public_method;
в случае с ребенком.
Обратите внимание, что объекты, созданные ex nihilo, не наследуются от Object (hasOwnProperty и т. Д.). Вы должны явно указать это как .from (Object).
Преимущество этой модели:
- память не впустую для каждого нового экземпляра
- Он придерживается истинного прототипного шаблона наследования
- Вы имеете доступ к родительскому объекту, используя это. parent (этот .__ proto__ специфичен для браузера)
- Частные переменные в настоящее время существуют
Существует один главный недостаток этого метода, о котором я могу думать: синтаксис «function()» может смутить людей в мысли, что функция назначается переменной вместо объекта.
Вопрос в том, есть ли другие недостатки, которые мне не хватает? (Не включайте недостатки прототипа - это субъективно, но только из моей реализации).
Вы должны выразить свою идею как сообщение в блоге. – Corv1nus
Объекты, созданные с помощью функции «from()», переданной «null», действительно наследуются от Object. – Pointy
К сожалению, моя первая версия этого сообщения использовала \ __ proto \ __ вместо этого и из (null) не наследовала от Object. Мне нужно идти, но я исправлю это позже ... – Nick