2014-09-26 2 views
0

Можно ли сделать что-то подобное: принудительно ли использовать стандартный объект javascript наследуемый от пользовательского объекта? (нет практического использования, просто риторический вопрос).Как заставить массив Javascript наследовать от моего пользовательского объекта?

var MyObject=function(){ 
     this.name="name from MyObject"; 
     } 

Array.prototype=new MyObject(); 
var array = new Array(); 
console.log(array.name); //undefined 
+1

Вы не можете. Почему бы просто не добавить свойства в 'Array.prototype'? Это имело бы в основном тот же эффект. – 2014-09-26 19:45:01

+0

@squint: Обычно считается плохой идеей расширения встроенных объектов в JavaScript, не так ли? Конечно, эта идея хуже на порядки. –

+1

Вы можете просто взглянуть на [spec] (http://es5.github.io/#x15.4.3.1), чтобы узнать, что 'Array.prototype' не доступен для записи. Итак, теоретически это возможно, но сначала вы должны проверить конфигурацию свойства. –

ответ

1

Конечно, вы можете переназначить прототип массива. Но делать это, вероятно, будет иметь ужасные последствия.

ECMAScript (на основе которого основан JavaScript) делает некоторые фундаментальные предположения относительно массивов. Я бы предположил, что некоторые реализации ECMAScript запретят переназначение прототипа внутреннего класса, в то время как другие позволят это (так как одинаково фундаментальное правило JavaScript заключается в том, что все может быть изменено где угодно в любое время).

Выполнение этого, тем не менее, сделает массив непредсказуемым и ненадежным.

+0

Я прошу не потому, что я хочу изменить Array, я читаю снова abt наследование, и это просто риторический вопрос. Я предполагаю, что любой объект в javascript может изменить родительский, не так ли? –

+0

В более ранних версиях ECMAScript да. Начиная с ES 5, это уже не так. –

0

Это происходит потому, что модификация этого свойства отключена (я думаю, что это требование спецификации ECMAScript 5 для собственных объектов, но не может найти ничего, чтобы это доказать). В хроме выполнения этого запроса:

 Object.getOwnPropertyDescriptor(Array, 'prototype') 

показывает дескриптор свойства

 Object { 
     value: Array[0], 
     writable: false, 
     enumerable: false, 
     configurable: false 
    } 
Смежные вопросы