JavaScript - Попытка добавить прототип из прототипа - PullRequest
2 голосов
/ 17 апреля 2011

Звучит проще, чем должно быть, но у меня проблемы с попыткой решить эту проблему. Моя ситуация в основном, я могу создать класс, который будет использовать прототип (пример: function exClass() {}).

И если я хочу добавить в класс, я могу просто использовать: exClass.prototype.newMethod() = '';.

Так почему же, если я нахожусь, например, в прототипе "newMethod", я больше не могу добавить новый прототип в "exClass". Вот пример того, что я имею в виду: this.prototype.test_var1 = '' - он терпит неудачу, как и exClass.test_var1.

Почему я не могу добавить больше к классу из одного из его подклассов?

Ответы [ 3 ]

4 голосов
/ 17 апреля 2011

Прототипом объекта является , а не свойство, называемое prototype объекта.Поле прототипа в функции - это объект, который станет прототипом объектов, созданных с помощью этой функции.Объект может получить доступ к прототипу функции, которая его создала, с помощью функции constructor.Например, this.constructor.prototype.test_var1 = '' будет работать в большинстве случаев.

Я говорю в большинстве случаев, потому что многие движки JavaScript имеют встроенный __proto__, который является прототипом объекта и может быть изменен на лету, но этонапример, не поддерживается в IE.

В ES5 вы можете использовать Object.getPrototypeOf () для надежного получения прототипа.Например, вы можете сказать, Object.getPrototypeOf(this).test_var1 = '' в ES5, который будет работать в современных браузерах, но не в браузерах без поддержки ES5.

3 голосов
/ 17 апреля 2011

Свойство prototype функции-конструктора exClass не ссылается на тот же объект, что и свойство prototype экземпляра exClass, то есть то, на что this ссылается внутри newMethod. Доказательство:

function exClass() {}
exClass.prototype.newMethod = function() {
    console.log(this.prototype === exClass.prototype); // false
    console.log(this.prototype); // undefined
}

var obj = new exClass();
obj.newMethod();

Выход:

false
undefined

В целом, каждый объект в JavaScript имеет прототип объект . Свойство prototype функции указывает, каким будет прототип object для класса объектов, созданных с помощью этой функции.

Ничто не мешает вам изменить prototype функции из другой функции:

exClass.prototype.newMethod = function() {
    exClass.prototype.anotherMethod = function() {}
}

Или более обобщенно:

exClass.prototype.newMethod = function() {
    this.constructor.anotherMethod = function() {}
}

Но я бы не советовал.

2 голосов
/ 17 апреля 2011

Вы не можете получить родительский прототип объекта через this.prototype. Вы должны использовать this.constructor.prototype (хотя это повлияет на поведение всех объектов этого типа, в данном случае exClass). Этот фрагмент предупредит «Привет, мир».

function exClass() {};

exClass.prototype.newMethod = function() {
    this.constructor.prototype.test_var1 = 'hello world';
}

obj = new exClass();
obj.newMethod();
alert(obj.test_var1);
...