2013-10-08 3 views
2
var Ninja = function() { 
    this.swingSword = function() { 
     return true 
    } 
} 
Ninja.swingFire = function() { 
    return true 
} 

var ninja = new Ninja() 
assert(ninja.swingFire()) // undefined 

Значит, это создает новый объект ниндзя, но почему в эту ситуацию не входит swingFire? Может кто-нибудь объяснить, почему?Как объекты работают в JavaScript?

+2

Потому что вы должны использовать 'prototype' с классами для добавления новых методов/членов' Ninja.prototype.swingFire = function() '. Вы можете использовать прямое назначение для объектных литералов – devnull69

+1

@ devnull69 OP может использовать то, что у них есть, но им нужно будет получить к нему доступ, как 'Ninja.swingFire()', и я уверен, что они не хотят этого делать (один, централизованный метод) – Ian

+0

Да, предоставлено ... – devnull69

ответ

8

Экземпляры, созданные с помощью new, наследуют от constructor.prototype, а не от самого объекта-конструктора. Это будет вести себя, как вы хотите:

Ninja.prototype.swingFire = function() { 
    return true; 
} 
+0

Могу ли я заключить, что 'this' в контексте this.swingSword' ссылается на прототип? – Strawberry

+2

Нет, это будет ссылка на экземпляр. Но когда вы пытаетесь получить доступ к свойству и его не найти в экземпляре, цепочка прототипов будет проверена. – bfavaretto

+0

Почему еще я хотел бы использовать 'this.swingSword', чтобы прикрепить его к экземпляру, а не использовать' Ninja.prototype.swingSword'? Я знаю, что затенение прототипа - это одно. – Strawberry

1

Если вы хотите знать, как объекты, функции, «классы» и наследование в JavaScript работе, вы должны смотреть на это видео:

The Definitive Guide к объектно-ориентированному JavaScript:http://youtu.be/PMfcsYzj-9M

Это лучшее объяснение объектной ориентации в JS, которое я когда-либо видел.

В вашем случае происходит следующее:

При создании new Ninja(), вы создаете новый пустой объект ({}) со свойством прототипа, который указывает на прототип функций игровая. Тогда функция Ninja будет вызываться как конструктор для вашего вновь созданного объекта. Он создает функцию swingSword и делает ее методом вашего объекта.

swingFire функция не быть назначен на свой созданный объект, потому что это метод самой функции, а не его прототип. Функции также являются объектами, поэтому они могут иметь свойства.

Если объект не имеет определенного свойства или метода, он рассматривает его прототип. Если прототип имеет указанное свойство/метод, он использует его вместо этого. Это означает, что если вы дадите прототип методу, каждый его объект может также использовать этот метод. Вот почему вы назначаете методы прототипу функции.

Снова: Посмотрите видео, и вы поймете это объяснение.

+0

Свойство 'prototype' конструктора * не * клонировано в экземпляры; экземпляры просто содержат ссылку на него. – bfavaretto

+0

@bfavaretto Ах, черт возьми, ты прав.Этот материал просто путает меня> _ <Я исправил его. – Butt4cak3

+0

Ты меня еще больше смутил ... теперь слишком сложно понять ... Я говорю, что после использования минус-прототипов несколько раз !!! –

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