JS __proto__ замена наследования - PullRequest
8 голосов
/ 01 марта 2011

Я использую наследование прототипа, как описано в 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/, и он все еще выглядит немного сложным и несколько излишним по сравнению с однострочным кодом:)

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

Ответы [ 3 ]

6 голосов
/ 01 марта 2011

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

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

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

4 голосов
/ 01 марта 2011

Вероятно:

MyString.prototype = new String;

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

1 голос
/ 01 марта 2011

Когда вы говорите:

MyString.prototype.__proto__ = String.prototype ;

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

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

MyString.prototype = new String();

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

...