путаница с упражнениями javascript - PullRequest
6 голосов
/ 04 августа 2011

Я только что получил Javascript: The Good Parts от Дугласа Крокфорда, и мне трудно понять один из его примеров, касающихся прототипов. Код в книге гласит:

if (typeof Object.create !== "function") {
    Object.create = function(o) {
        var F = function () {}
        F.prototype = o;
        return new F;
    };
}

Я предполагаю, что этот код используется для нацеливания на прототип функции. Но зачем использовать такой комплексный подход? Почему бы просто не использовать variable .prototype? Крокфорд является ведущим экспертом по Javascript, поэтому я уверен, что есть веская причина для использования этой модели. Кто-нибудь может помочь мне понять это лучше? Любая помощь будет оценена.

Ответы [ 4 ]

5 голосов
/ 04 августа 2011

В ECMAScript 3 оператор new был единственным стандартным способом установки внутреннего свойства [[Prototype]] объекта, в этом случае Крокфорд просто использует временную функцию конструктора F для этой цели.

Аргумент o этого метода устанавливается как свойство prototype временного конструктора, и, вызывая new F();, он создает новый пустой объекткоторая наследуется от F.prototype (см. этот вопрос для получения более подробной информации о том, как new работает).

Например:

var a = { a: 1 };
var b = Object.create(a); // b inherits from a
b.a; // 1

В приведенном выше примеремы можем сказать, что внутреннее свойство b [[Prototype]] указывает на a.

Object.getPrototypeOf(b) === a; // true

Другими словами, b наследуется от a.

св том же примере мы могли бы использовать пустой конструктор, например:

 function F(){}
 F.prototype = a;

 var b = new F(); // b again inherits from a (F.prototype)

Помните также, что свойство prototype функций отличается от свойства [[Prototype]], которое есть у всех объектов, свойства prototypeфункций используется при вызове с новым оператором, чтобы построитьновый объект, который наследуется от этого свойства.

Также имейте в виду, что в настоящее время внедряется стандарт ECMAScript 5, и эта прокладка не соответствует 100% спецификации, на самом деле, есть некоторыефункции стандартного Object.create метода , которые нельзя эмулировать на ES3 .

См. Также:

3 голосов
/ 04 августа 2011
var bar = Object.create(foo)

против

var bar = new Object()

первый bar имеет foo в качестве прототипа;второй имеет Object в качестве прототипа.

1 голос
/ 04 августа 2011

Этот код предназначен для более старых реализаций JavaScript, которые не поддерживают Object.create, что указано в стандарте ECMAScript 5, выпущенном в ноябре 2009 года.

Многие люди говорят, что предпочтительным способом создания объекта является указание прототипа для него во время создания. Это можно назвать differential inheritance или prototypal inheritance. Фактически, это то, что Object.create делает:

var protoCircle = {x: 0, y: 0, radius: 1, color:"black"};
var myCircle = Object.create(protoCircle);
myCircle.x = 3;
myCircle.color = "green";

Это делает зеленый круг радиуса 1 с центром в (3,0).

Причина, по которой код настолько сложен, что до того, как Object.create был добавлен в JavaScript, единственный способ установить прототип объекта - создать его с помощью оператора new . Объекты, созданные с помощью new, получили в качестве прототипа значение свойства prototype конструктора. Это определенно сбивает с толку, но свойство prototype НЕ является прототипом объекта. Для данного функционального объекта f, f.prototype - это объект, который будет назначен в качестве прототипа всех объектов, построенных с помощью new f(). Реальный прототип объекта называется [[prototype]] или __proto__, но вы не можете получить к ним доступ в стандартном ECMAScript. Смущает, а?

В качестве примечания. спецификация ES5 имеет более расширенную спецификацию Object.prototype, чем определенная Крокфордом. Для настройки свойств определяемого объекта требуется второй объект.

0 голосов
/ 04 августа 2011

Этот метод создания создаст экземпляр нового объекта, учитывая переданный объект как прототип.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...