2012-01-01 4 views
2

Я изучаю Js недавно от «JavaScript the Good Parts», и в соответствии с моим пониманиемDifferent между object.propertyName и объектом [ «ИмениСвойства»] в Javascript

Object.propertyName Урожайность же результат, как Object["propertyName"] (Пожалуйста, поправьте меня, если я «Неправильно и описать разницу этих двух».

Я пытаюсь увеличить в Function.prototype сделать метод доступны для всех функций, как показано ниже:

Function.prototype.method = function (name, func) { 
      this.prototype[name]= func; 
    }; 

И это работает fine.However, когда я замена this.prototype[name] с this.prototype.name , он будет работать нормально, как ожидалось!

Это, как я проверяю его:

Number.method("myRoundFunction", function() { 
     return Math[this < 0 ? "ceil" : "floor"](this); 
    }); 
    console.log((-10/3).myRoundFunction()); 

Это показывает ожидаемое значение (-3) при использовании this.prototype[name], но

(-3,3333333333333335) .myRoundFunction не является функцией

об изменении его this.prototype.name

Может ли кто-нибудь уточнить, почему это происходит?

Заранее благодарим за любую помощь.

ответ

4

Что происходит, так это то, что name является переменной и не может использоваться непосредственно с точечной нотацией. Чтобы лучше проиллюстрировать проблему, скажем, вы передаете значение "newMethod" для имени. Теперь, когда вы делаете:

this.prototype[name] = func; 

... это эквивалентно записи:

this.prototype["newMethod"] = func; 

Но когда вы делаете:

this.prototype.name = func; 

...вы назначаете свойство name объекта, а не свойство newMethod. Переменная, которую вы передали в параметре name, вообще не упоминается в приведенном выше описании.

Синтаксиса, который преформы назначения вы ожидаете является:

this.prototype.newMethod = func; 

Но вы не можете выразить, что с помощью точечной нотации и переменной name (за исключением, возможно, путем обмана и с использованием конкатенации и eval()). В таком случае вместо этого вы должны использовать нотацию индекса массива.

3

Прототип определяет определение классов JS; тогда как нечто вроде Number.parse является прямой функцией типа (аналогично статическому методу). Если я:

myclass.prototype["name"] = function() { } 

Я добавляю метод к следующему экземпляру класса, в то время как:

myclass["name"] = function() { } 

Добавляет функцию непосредственно к объекту класса, а не к следующему экземпляру MyClass , Я думаю, что это то, что происходит, когда я вижу определение Number.method?

Или я что-то упускаю?

2

name является переменной, когда вы используете this.prototype.name, это то же самое, как вы называете this.prototype["name"], а не то, что вы думаете, как this.prototype[name].