2011-03-01 17 views
8

I m utilizando la herencia de prototipo como se ha descrito en https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/ProtoJS __proto__ reemplazo herencia

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

MyString.prototype.__proto__ = String.prototype ; 

Ahora puedo utilizar funciones de cadena y funciones mystring en instancias mystring.

Pero desde __proto__ está en desuso, no es estándar y debe evitarse, ¿cuál sería la mejor manera de heredar objetos?

He encontrado http://ejohn.org/blog/simple-javascript-inheritance/ y todavía parece un poco complejo y un tanto excesivo, en comparación con un código de una sola línea :)

Edit: Gracias por sus respuestas!

Respuesta

4

Probablemente:

MyString.prototype = new String; 

Después de hacer esto se puede aumentar el prototipo con sus métodos :)

+0

+1, Exactamente, p. http://jsfiddle.net/uSyqG/ – CMS

1

cuando usted dice:

MyString.prototype.__proto__ = String.prototype ; 

¿Estás diciendo que el tiempo de ejecución debe buscar en String.prototype para propiedades de MyString.prototype que no están declaradas en MyString.prototype directamente. Pero esa es una manera indirecta de decir lo que estaba tratando de decir, que es que instancias de MyString deben tener las mismas propiedades y métodos que String.

Es decir que de esta manera:

MyString.prototype = new String(); 

__proto__ es una propiedad del objeto casos. Es el enlace de tiempo de ejecución al objeto que sirve como prototipo de esa instancia. Por otro lado, prototype es una propiedad de funciones de constructor. Es la plantilla para todos los objetos creados con ese constructor.

6

La especificación ECMAScript 5 incluye una nueva función Object.create() que le permite crear un objeto genérico con un prototipo específico. Para obtener el comportamiento que desea que haría:

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

Object.create se puede utilizar para crear una cadena de prototipo de longitud arbitraria, simplemente mediante valores de retorno a lo largo de la cadena. Lamentablemente, no nos da la capacidad de modificar la cadena de prototipos de un objeto existente (por lo que no resuelve el problema de "herencia" de la matriz)

+0

Tenga en cuenta que no todos los navegadores admiten Object.create aún. Douglas Crockford tiene una solución para esto que se describe es su sitio. Sin embargo, hay una página que describe todas las alternativas para heredar en javascript (incluido Crockford): http://javascript.info/tutorial/inheritance –