Наследование JavaScript: объект.создать против нового
в JavaScript в чем разница между этими двумя примерами:
обязательное условие:
function SomeBaseClass(){
}
SomeBaseClass.prototype = {
doThis : function(){
},
doThat : function(){
}
}
пример наследования объекта using.создать:
function MyClass(){
}
MyClass.prototype = Object.create(SomeBaseClass.prototype);
пример наследования B с использованием нового ключевого слова
function MyClass(){
}
MyClass.prototype = new SomeBaseClass();
оба примера, кажется, делают то же самое. Когда бы вы выбрали одно над другим?
дополнительный вопрос:
Рассмотрим код в приведенной ниже ссылке (строка 15) , где ссылка на собственный конструктор функции хранится в прототипе. Почему это полезно?
https://github.com/mrdoob/three.js/blob/master/src/loaders/ImageLoader.js
выписка (если вы не хотите открывать ссылку):
THREE.ImageLoader.prototype = {
constructor: THREE.ImageLoader
}
4 ответов:
в своем вопросе вы упомянули, что
Both examples seem to do the same thing, это совсем не так, потому чтоfunction SomeBaseClass(){...} SomeBaseClass.prototype = { doThis : function(){...}, doThat : function(){...} } function MyClass(){...} MyClass.prototype = Object.create(SomeBaseClass.prototype);в этом примере, вы просто наследуют
SomeBaseClass' prototypeно что, если у вас есть собственность вSomeBaseClassкакfunction SomeBaseClass(){ this.publicProperty='SomeValue'; }и если вы используете его как
var obj=new MyClass(); console.log(obj.publicProperty); // undefined console.log(obj);The
оба примера, кажется, делают то же самое.
это верно в вашем случае.
когда вы выбрали один над другим?
, когда
SomeBaseClassимеет тело функции, это будет выполняться сnewключевое слово. Обычно это не предназначено - вы только хотите настроить цепочку прототипов. В некоторых случаях это даже может вызвать серьезные проблемы, потому что вы на самом деле instantiate объект, чьи частные переменные являются общими для всехMyClassэкземпляры, поскольку они наследуют одни и те же привилегированные методы. Другие побочные эффекты можно себе представить.Итак, вы должны, как правило, предпочитают
Object.create. Тем не менее, он не поддерживается в некоторых устаревших браузерах; именно по этой причине вы видитеnew-подход слишком часто, как это часто бывает нет (явных) повреждений. Также посмотреть ответ.
разница становится очевидной, если вы используете
Object.create()как и предполагалось. На самом деле, он полностью скрываетprototypeслово из вашего кода, он будет делать работу под капотом. ИспользуяObject.create(), мы можем пойти какvar base = { doThis : function(){ }, doThat : function(){ } };и тогда мы можем расширить / наследовать другие объекты от этого
var myObject = Object.create( base ); // myObject will now link to "base" via the prototype chain internallyтак что это еще одна концепция, более "объектно-ориентированный" способ наследования. Нет никакой "функции конструктора" из коробки с помощью
Object.create()например. Но, конечно, вы могли бы просто создайте и вызовите self defined функции-конструктора внутри этих объектов.один аргумент для использования
Object.create()это может выглядеть более естественные до mix / * наследовать* от других объектов, чем с помощью Javascripts по умолчанию.
Я не специалист в Java скрипте, но вот простой пример, чтобы понять разницу между "объектом.создать "и" новый"..
Шаг 1: Создайте родительскую функцию с некоторыми свойствами и действиями..
function Person() { this.name = 'venkat'; this.address = 'dallas'; this.mobile='xxxxxxxxxx' } Person.prototype.func1 = function () { return this.name + this.address; }Шаг 2: Создайте дочернюю функцию (PersonSalary), которая распространяется выше функции Person с помощью новая ключевое слово..
function PersonSalary() { Person.call(this); } PersonSalary.prototype = new Person(); PersonSalary();Шаг 3: Создайте вторую дочернюю функцию (PersonLeaves), которая распространяется выше функции человека с помощью
Comments