Замена наследования JS __proto__

Я использую наследование прототипов, как описано в https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/Proto

function MyString(data){this.data = data ;}
MyString.prototype = { data : null,
 toString: function(){ return this.data ;}
} ;

MyString.prototype.__proto__ = String.prototype ;

Теперь я могу использовать функции String и функции MyString в экземплярах MyString.

Но поскольку __proto__ устарел, нестандартен и его следует избегать, как лучше всего наследовать объекты?

Я нашел http://ejohn.org/blog/simple-javascript-inheritance/ и это все еще выглядит немного сложным и несколько излишним по сравнению с однострочным кодом :)

Редактировать: Спасибо за ваши ответы!


person azerty    schedule 01.03.2011    source источник


Ответы (3)


Спецификация ECMAScript 5 включает новую функцию Object.create(), которая позволяет создавать универсальный объект с определенным прототипом. Чтобы получить желаемое поведение:

MyString.prototype = Object.create(String.prototype)
MyString.prototype.toString = ....

Object.create можно использовать для создания произвольно длинной цепочки прототипов, просто возвращая значения по цепочке. К сожалению, это не дает нам возможности изменять цепочку прототипов существующего объекта (поэтому это не решает проблему «наследования» массива).

person olliej    schedule 01.03.2011
comment
Обратите внимание, что не все браузеры пока поддерживают Object.create. У Дугласа Крокфорда есть обходной путь, описанный на его сайте. Однако есть страница, описывающая все альтернативы наследования в javascript (включая Crockford): javascript.info/tutorial/inheritance - person Marco Luglio; 06.09.2011

Вероятно:

MyString.prototype = new String;

После этого вы можете дополнить прототип своими методами :)

person James    schedule 01.03.2011

Когда ты говоришь:

MyString.prototype.__proto__ = String.prototype ;

Вы говорите, что среда выполнения должна искать в String.prototype свойства MyString.prototype, которые не объявлены в MyString.prototype напрямую. Но это окольный способ сказать то, что вы пытались сказать, а именно, что экземпляры MyString должны иметь те же свойства и методы, что и String.

Вы говорите это так:

MyString.prototype = new String();

__proto__ — это свойство экземпляров объекта. Это ссылка времени выполнения на объект, который служит прототипом этого экземпляра. С другой стороны, prototype является свойством функций-конструкторов. Это шаблон для всех объектов, созданных с помощью этого конструктора.

person Wayne    schedule 01.03.2011