Наследование классов в Javascript - PullRequest
6 голосов
/ 25 января 2010

Мне интересно, как симулировать наследование классов в JavaScript. Я знаю, что класс не применим к JavaScript, мы используем функции для создания объектов и выполнения наследования через объект Prototype.

Например, как вы преобразуете эту структуру в JavaScript:

public class Mankind {
    public string name;
    public string lastname;
}

public class Person: Mankind {
    public void Run(string fromWhat) {
        //write the run logic
    }
}

Что является эквивалентом этого фрагмента кода в JavaScript.

* * 1008 Edit: * * 1010

Я также нашел другую ссылку, где Дуглас Крокфорд объясняет различные модели наследования, как CMS : Классическое наследование в JavaScript .

Надеюсь, это поможет и другим.

Ответы [ 3 ]

9 голосов
/ 25 января 2010

Существует множество способов реализации наследования и повторного использования поведения в JavaScript, возможно, способ, более похожий на ваш основанный на классах пример ООП, будет псевдоклассическим наследованием:

function Mankind (name, lastname) {
  this.name = name;
  this.lastname = lastname;
}

function Person (name, lastname) {
  this.name = name;
  this.lastname = lastname;

  this.run = function() {
    // run logic
  };
}
Person.prototype = new Mankind();
Person.prototype.walk = function () {
  // walk logic
};

Разница между run и walk заключается в том, что первый будет существовать в каждом экземпляре объекта Person, а второй метод, walk, будет существовать только в Person.prototype и будет доступен через Прототип цепи.

В этом паттерне вы видите небольшое дублирование кода, нам нужна логика для инициализации полей также в унаследованном конструкторе, еще один паттерн, который избегает этого, - это приложение Constructor Function:

function Mankind (name, lastname) {
  this.name = name;
  this.lastname = lastname;
}

function Person (name, lastname) {
  Mankind.apply(this, arguments);
  this.run = function() {
    // run logic
  };
}

Дополнительная информация:

0 голосов
/ 20 апреля 2013
(function(){
function Mankind() {
    this.name = "joe";
}
function Person(){
    this.Run = function(fromWhat){
        alert(this.name + ' runs from ' + fromWhat + '!');
    }
}
Person.prototype = new Mankind;

var dude = new Person;
dude.Run('bear');
})()

Вместо использования статических определений структуры данных (типа класса), javascript использует функции для динамического создания прототипов структуры данных. Это большой скачок, потому что он позволяет вам строить структуру, собирая достаточно контекста, чтобы знать, что вам действительно нужно. Цепочка прототипов также динамична, что является еще одним большим скачком, и я только начинаю оборачиваться вокруг нее.

Вместо других слов, проверьте следующий источник Люк:

(function(){
// prototype chaining example
function f1(){this.foo = "foo"}
function f2(){this.bar = "bar"}
function f3(){this.bat = "bat"}
f2.prototype = new f1();
f3.prototype = new f2();
var a = new f1;
var b = new f2;
var c = new f3;
// state is inherited
var member_list = [
a.foo, // "foo"
a.bar, // undefined
a.bat, // undefined
b.foo, // "foo"
b.bar, // "bar"
b.bat, // undefined
c.foo, // "foo"
c.bar, // "bar"
c.bat // "bat"
];
// prototypes are chained
var instanceof_list = [
a instanceof f1, // true
a instanceof f2, // false
a instanceof f3, // false
b instanceof f1, // true
b instanceof f2, // true
b instanceof f3, // false
c instanceof f1, // true
c instanceof f2, // true
c instanceof f3 // true
];

// try to break chain
function f4(){this.fu = "fu"}
f2.prototype = new f4;

// state is preserved
var member_list2 = [
a.foo, // "foo"
a.bar, // undefined
a.bat, // undefined
b.foo, // "foo"
b.bar, // "bar"
b.bat, // undefined
c.foo, // "foo"
c.bar, // "bar"
c.bat // "bat"
];
// chain not broken, but link is removed 
var instanceof_list2 = [
a instanceof f1, // true
a instanceof f2, // false
a instanceof f3, // false
b instanceof f1, // true
b instanceof f2, // false
b instanceof f3, // false
c instanceof f1, // true
c instanceof f2, // false
c instanceof f3 // true
];
// no new link is added
var instanceof_list3 = [
a instanceof f4, // false
b instanceof f4, // false
c instanceof f4 // false
];
debugger    
})()
0 голосов
/ 25 января 2010

проверить mooTools

http://mootools.net/docs/core/Class/Class

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...