Для родителей/дочерних классов, я хотел бы сделать что-то вроде этого
// your parent class
var Parent = function() {
// parent constructor
console.log("parent constructor!");
// some public properties
this.foo = "foo";
this.bar = "bar";
// a private data member
var secret = "123456";
};
// a parent function
Parent.prototype.something = function() {
console.log("something!");
}
// your child class
var Child = function() {
// call parent constructor
Parent.call(this);
// child constructor
console.log("child constructor!");
// override bar
this.bar = "override!";
};
// the magic!
// child prototype build from parent prototype
Child.prototype = Object.create(Parent.prototype, {constructor: {value: Child}});
Пример использования
var c = new Child();
c.something();
// => parent constructor!
// => child constructor!
// => something!
c.foo //=> "foo"
c.bar //=> "override!"
Если вы используете «разделяет пространства имен» понятие идентично.
Вы можете увидеть эту картину в ряде библиотек
EDIT
За ваши комментарий, вот и добавила демонстрацию
var Foo = function(){};
Foo.prototype.hello = function(){ return "hello!"; };
var foo = new Foo();
// call our hello method
// this calls foo.__proto__.hello
foo.hello(); //=> "hello!"
// override `hello` method for this instance
foo.hello = function(){ return "こんにちは"; };
// call our hello method again
// this calls foo.hello because it is defined directly on our instance
// (it has a higher precedence in the lookup chain)
foo.hello(); //=> "こんにちは"
// remove the override
delete foo.hello;
// call our hello method again
// this goes back to calling foo.__proto__.hello
foo.hello(); //=> "hello!"
// remove the method prototype
delete Foo.prototype.hello
// call our hello method one last time
// spoiler: it's gone!
foo.hello(); //=> TypeError: Object [object Object] has no method 'hello'
Как вы можете видеть, вы потеряете эту функцию, непосредственно определяющие методы на экземпляре с использованием this.something = function(){};
. Я лично предпочитаю определять методы на прототипе из-за дополнительной гибкости. Таким образом, прототип действительно работает как план. Вы получаете все предопределенное поведение; вы можете изменить, если необходимо, и вернуться к оригиналу, когда захотите, все на основе каждого экземпляра.
ЕЩЕ ОДИН ВЕЩЬ
В нашем последнем примере мы имели метод прототипа и переопределение метода экземпляра. Есть ли способ вызвать оригинальный метод? Посмотрим!
var Foo = function(){};
Foo.prototype.hello = function(){ return "hello!"; };
var foo = new Foo();
foo.hello = function(){ return "こんにちは!"; }
// call override method
foo.hello(); //=> "こんにちは!"
// call original method
Foo.prototype.hello.call(foo); //=> "hello!"
// japanese just one more time...
foo.hello(); //=> "こんにちは!"
Это тоже сработает, но у меня никогда не было необходимости. Я полагаю, что выгода вам не нужно знать исходный класс таким образом :)
// call original method from the instance
foo.__proto__.hello.call(foo); //=> "hello!"
Прототипы!
Почему вы используете IIFE для ребенка, но не для родителей? Кажется, что этот код никогда не будет работать. – Bergi
Почему вы пишете классы в стиле с языка с совершенно другой системой классов? javascript классы МОГУТ заставить действовать «как» C (или классические) классы, но вы обнаружите, что намного легче прекратить работать против него и идти с потоком. – tkone
@Bergi, код работает просто отлично в webkit/moz. Доступны все дочерние переменные и методы родителя. –