Наследование объектов - PullRequest
0 голосов
/ 19 июля 2011

Я прочитал, что наследование Javascript является прототипом. Что это значит? Как объект, определенный программистом, может наследовать свойства предопределенного объекта, такого как окно? Например, мне нужна функция eval () в моем собственном классе. Как это может быть достигнуто?

Ответы [ 3 ]

3 голосов
/ 19 июля 2011

Если оставить в стороне вопрос о том, следует ли наследовать от window, вот простой пример, демонстрирующий , как сделать это:

function Test() {
    // constructor code
}

Test.prototype = window;

var t = new Test();
t.eval();

При вызове с использованием оператора new функция Test создает новый экземпляр Test, прототип которого связан с объектом window. Прототипом функции может быть любой объект.

1 голос
/ 19 июля 2011

Подсказка: не используйте new для объявления объектов.Object.create - это правильный способ создания объектов JavaScript.Поддерживается во всех современных браузерах.Для других браузеров в нижней части этой статьи есть хороший шим:

http://javascript.crockford.com/prototypal.html

Одна проблема с конструкторами, которые используют 'new', состоит в том, что если люди случайно вызывают его как обычную функцию, он будет вносить изменения в глобальную переменную (т. е. в окно в браузере), используя переменную this, поэтому this следует резервировать только для функций-прототипов, и я предпочитаю использовать that вместо this

Я лично использую стиль, который поддерживает new obj(), obj() и obj.init(), который может быть одним дополнительным указателем на функцию, но я думаю, что он добавляет семантическое значение

function obj(){
    var that = Object.create(obj.prototype)
    //any constructor logic goes here
    return that
}
obj.prototype = Object.create(Superclass.prototype)

obj.init = obj //completely optional

//other function declarations

obj.prototype.someFunction = function(){
    //logic for someFunction
}
0 голосов
/ 19 июля 2011

Чего именно вы хотите достичь?Вот самый простой (не лучший) способ наследования прототипа:

var obj1=new Object1Constructor();
var obj2=new Object2Constructor();

obj2.prototype=obj1;

Это означает, что obj1 наследует все свойства obj2

. Я забыл главное:eval == зло;

ОБНОВЛЕНИЕ: я сделал ошибки в коде выше.Это не наследство.Вот обновленный код:

var Object1Constructor=function(){ // one object constuctor
    //properties definition goes here
}

var Object2Constructor=function(){ // another object constuctor
    //properties definition goes here
}

Object2Constructor.prototype=new Object1Constructor();

var obj=new Object2Constructor();

И это унаследование.Теперь obj имеет свойства, определенные в Object2Constructor и Object1Constructor - родительском «классе».Смотрите комментарий CMS ниже.Он совершенно прав.

...