Наследование 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
}
533   4  

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

    Ничего не найдено.