В JavaScript в чем разница между этими двумя примерами:
Необходимое условие:
function SomeBaseClass(){
}
SomeBaseClass.prototype = {
doThis : function(){
},
doThat : function(){
}
}
Пример наследования A с использованием Object.create:
function MyClass(){
}
MyClass.prototype = Object.create(SomeBaseClass.prototype);
Пример наследования B с использованием ключевого слова new
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
}
javascript
inheritance
object-create
ChrisRich
источник
источник
Object.create
. Это ошибка, и ее следует открыть повторно.Ответы:
В своем вопросе вы упомянули, что
Both examples seem to do the same thing
это совсем не так, потому чтоВаш первый пример
В этом примере вы просто наследуете,
SomeBaseClass' prototype
но что, если у вас есть свойство вSomeBaseClass
подобноми если вы используете это как
У
obj
объекта не будетpublicProperty
свойства, как в этом примере .Ваш второй пример
Он выполняет
constructor
функцию, создает экземплярSomeBaseClass
и наследует весьSomeBaseClass
объект. Итак, если вы используетеВ этом случае его
publicProperty
собственность также доступнаobj
объекту, как в этом примере .Поскольку
Object.create
в некоторых старых браузерах функция недоступна, в этом случае вы можете использоватьПриведенный выше код просто добавляет
Object.create
функцию, если она недоступна, поэтому вы можете использоватьObject.create
функцию, и я думаю, что приведенный выше код описывает, что наObject.create
самом деле делает. Надеюсь, это каким-то образом поможет.источник
SomeBaseClass
.Это правда в вашем случае.
Когда
SomeBaseClass
есть тело функции, это будет выполняться сnew
ключевым словом. Обычно это не предназначено - вам нужно только настроить цепочку прототипов. В некоторых случаях это может даже вызвать серьезные проблемы, потому что вы фактически создаете экземпляр объекта, переменные с частной областью видимости которого используются всемиMyClass
экземплярами, поскольку они наследуют одни и те же привилегированные методы. Возможны и другие побочные эффекты.Итак, вы обычно должны предпочесть
Object.create
. Тем не менее, он не поддерживается в некоторых устаревших браузерах; по этой причине выnew
слишком часто видите -подход, поскольку он часто не приносит (очевидного) вреда. Также посмотрите этот ответ .источник
Разница становится очевидной, если использовать
Object.create()
по назначению. Фактически, он полностью скрываетprototype
слово от вашего кода, он выполняет свою работу под капотом. ИспользуяObject.create()
, мы можем пойти какИ затем мы можем расширить / унаследовать другие объекты от этого
Это еще одна концепция, более «объектно-ориентированный» способ наследования.
Object.create()
Например, нет готовой к использованию "функции конструктора" . Но, конечно, вы можете просто создать и вызвать функцию- конструктор внутри этих объектов.Одним из аргументов в пользу
Object.create()
является то , что она может выглядеть более естественно , чтобы смешать / * * унаследует от других объектов, чем использование JavaScripts пути по умолчанию .источник
Object.create
действительно не может заменить классический подход тем,new
когда требуется функция-конструкторObject.create
что не вызывает функцию, которая была бы необходима для создания замыканий. Конечно, сObject.create
вами можно положитьinit
метод на ваших объектах и вызова , которые немедленно и это , возможно , даже возвращаетthis
так , что вы получите краткий синтаксис - но ждать, что это конструктор тогда.new
использует «объектную связь», так что особой разницы нет. Фактически, есть только две вещи:.constructor
вызывается.init
, и эта функция не имеет.prototype
свойства, указывающего на ваш объект-прототип. В остальном это просто синтаксис - и я предпочитаюnew X
болееObject.create(x).init()
.Я не эксперт в java-скриптах, но вот простой пример, чтобы понять разницу между "Object.create" и "new" ..
шаг 1: создайте родительскую функцию с некоторыми свойствами и действиями ..
Шаг 2: создайте дочернюю функцию (PersonSalary), которая расширяется над функцией Person с помощью ключевого слова New ..
Шаг 3: создайте вторую дочернюю функцию (PersonLeaves), которая расширяется над функцией Person с помощью ключевого слова Object.create ..
// Теперь проверяем прототипы обеих дочерних функций.
обе эти дочерние функции будут связаны с прототипом Person (родительская функция) и могут получить доступ к его методам, но если вы создадите дочернюю функцию с помощью new, она вернет совершенно новый объект со всеми родительскими свойствами, которые нам не нужны, а также при создании любых объект или функция, использующие "New", выполняется эта родительская функция, которой мы не хотим быть.
Вот выводы
источник