2016-10-04 2 views
1

Привет, я довольно новичок в Javascript. Я немного смущен новым словом и его ролью в решении вывода экземпляра оператора.new и instanceof Javascript

Случай 1. Возвращение объекта буквального

var Dog=function(){ 
return{legs:4,bark:alert("BOW!!")};}; 

var luna=Dog(); 

luna instanceof Dog;//why false here 
false 

var luna=new Dog(); 

luna instanceof Dog;//why false here 
false 

Случай 2: Теперь вместо возврата объекта буквальным я ничего не делаю,

var Dog=function(){ 
}; 
var luna=Dog(); 

luna instanceof Dog 
false 

var luna=new Dog(); 

luna instanceof Dog;//why true here 
true 
+1

Довольно точное объяснение: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Operators/instanceof – Scarysize

ответ

4
var luna=Dog(); 
luna instanceof Dog;//why false here 

Поскольку вы:

  1. Не использовать new оператор
  2. Возвращается простой объект
var luna=new Dog(); 
luna instanceof Dog;//why false here 

Поскольку вы вернулись простой объект, который отменяют объект создается оператором new.

var luna=new Dog(); 
luna instanceof Dog;//why true here 

Потому что:

  1. ли использовать new оператор
  2. Не переопределять возвращаемое значение
+0

Может быть, вы могли бы включают связь между новым оператором и прототипом (что и используется экземпляром). –

+0

@Quentin Так это так за кулисами ??? var Dog = function() { var obj = Object.create (Dog.prototype); return obj; }; – user3847870

1

Случай 1:

var Dog=function(){ 
return{legs:4,bark:alert("BOW!!")};}; 

var luna=Dog(); 
luna instanceof Dog; 
false 

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

var Dog=function(){ 
return new Object(); 
} 

Конструктор возвращаемого значения объект: luna.constructor является Object() функцией.

var luna=Dog(); 
luna instanceof Dog; 
false 


var luna=new Dog(); 

luna instanceof Dog; 
false 

Вы не можете создать экземпляр функцию, которая возвращает что-то

Случай 2:

var Dog=function(){ 
}; 
var luna=Dog(); 

Это называется функция, функция, которая не возвращает ничего, на самом деле она возвращает undefined

luna instanceof Dog 
false 

, потому что undefined не является экземпляром ничего

var luna=new Dog(); 

Создает новый Object, имеющий собаку, как конструктор luna.constructor является Dog()

luna instanceof Dog;//luna is an object here 
true 

Новый оператор используется для указания того, что функция должна делать: без него возвращает значение (или undefined), при этом он создает экземпляр нового объекта от конструктора (здесь Dog)

1

Использование function ключевое слово для создания классов может ввести в заблуждение. Когда вы вызываете Dog() без ключевого слова new, вы выполняете не более вызова функции; классы не задействованы.

В случае 1, первый luna только результат, когда Dog называется простой функцией: {legs:4, bark: alert("BOW!!")} и не имеет ничего общего с Dog как класса. То же самое относится ко второму luna. Поскольку Dog возвращает объект, он переопределяет экземпляр класса, который обычно создается с помощью new.

В случае 2 первый luna точно так же, как первый luna в случае 1, простой объект. Но второй luna является экземпляром , потому что используется ключевое слово new, что означает, что Dog рассматривается как класс вместо функции, и ничего не возвращается с Dog.

(Кроме того, вы должны изменить объект {legs: 4, bark: function() { alert("BOW!!"); }}.)

+0

Да, я задавался вопросом, почему чертовски предупредил, что он исполнял. Ник !. – user3847870