2015-02-01 4 views
0
function Foo() {} 

var f1 = new Foo(); // This is clearly an instance of Foo. 

var f2 = Object.create(Foo.prototype); // Is this an instance of Foo? 

Ясно f2 instanceof Foo возвращает true, но я говорю в более общем объектно-ориентированном смысле.Существует ли строгое определение «экземпляра» функции-конструктора?

И, наконец, в чем разница между f1 и f2, так что Chrome может различать их при печати на консоль?

console.log(f1); // Foo {} 
console.log(f2); // Object {} 
+0

От точки зрения JS нет никакой разницы. Это просто внутренняя маркировка, которую Chrome делает для печати на консоли. – Bergi

+0

Вы знаете, где находится эта маркировка. Это в спецификации? – Ben

+0

Это не в спецификации, поэтому я сказал «внутреннее» и «нет разницы в JS» :-) Вероятно, это где-то в источнике V8 [[construct]]. – Bergi

ответ

1

Есть ли строгое определение «экземпляра» функции-конструктора?

№ Вы можете использовать определение instanceof, то есть объект должен наследовать от соответствующего объекта-прототипа. Но в смысле ООП обычно также подразумевается, что объект был создан вызовом конструктора; или, по крайней мере, каким-то образом реализует интерфейс (те же свойства), который был бы установлен в конструкторе.

Наконец, в чем разница между f1 и f2 таким образом, что Chrome может различать их при печати их на консоль?

Это что-то внутреннее для Chrome, только для красивой печати на консоли (ну и, возможно, V8 выполняет некоторые другие оптимизации на основе такой метки).

Эти два объекта неотличимы от точки зрения JavaScript.

0
var f1 = new Foo(); // This is clearly an instance of Foo. 

var f2 = Object.create(Foo.prototype); // Is this an instance of Foo? 

в настоящее время, как только Foo экземпляры.

Object.create() создает экземпляр переданного аргумента. Если ничего не передано, он создаст экземпляр объекта.

Смежные вопросы