2014-09-30 5 views
1

На днях я играл в Javascript, и я заметил, что я не могу написать прототип объекта в прототипе функции. Например:Javascript вложенные прототипы

var obj = function() { } 

obj.prototype.First = function() { 
    this.prototype.Second = function() { 
     alert("Second Prototype"); 
    } 
} 

obj.First(); 
obj.Second(); 

По какой-то причине второй прототип не будет работать и код не будет работать. Является ли мой синтаксис неправильным или существуют некоторые ограничения прототипа, о которых я не знаю? Благодаря!

Edit:
Я не пытаюсь добавить прототип прототипа ... что бы не имеет особого смысла. Это то, что я пытаюсь сделать: добавьте два отдельных прототипа в obj. Прототип 2 определяется при вызове прототипа 1. Я думал, что this будет содержать ссылку на объект, поэтому this.prototype будет таким же, как obj.prototype, но он не работает должным образом.

+0

Почему бы просто не использовать 'obj.prototype.Second = ...'? –

+2

Вы вводите в заблуждение функции и экземпляры. – SLaks

+0

'obj' - это функция. 'obj.prototype' является свойством функции и используется только при вызове функции с помощью' new'. Например. 'var foo = new obj();'. 'foo.First' теперь будет доступен, потому что' obj.prototype' является прототипом 'foo'. Однако 'obj.First' не может работать, потому что вы никогда не создавали свойство' First' на 'obj'. –

ответ

1

Возможно, this может помочь вам понять роль функции-конструктора и прототипа.

В зависимости от того, что вы пытаетесь сделать (объект, первый и второй не реально показать свое намерение) вы могли бы сделать:

Людей имеют глаз. Это можно сделать с помощью композиции.

Работодатель - это Лицо, но лицо не обязательно является Работодателем (может быть Клиентом или Консультантом). Это можно сделать через наследование.

Кошка может двигаться. В языке, основанном на классе, Cat должен реализовать Movable, но в JavaScript вы можете использовать mix ins и оставить реализацию реализацией по умолчанию, которую Movable предоставляет или переопределяет. JavaScript не компилирует проверку времени, если вы реализуете определенные вещи.

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

Возможно, вам стоит вернуть экземпляр другого типа.

var Customer = function(name) { 
    this.name=name || 'unknown'; 
}; 
Customer.createVipCustomer = function() { 
    return new VipCustomer(this); 
} 
var VipCustomer=function(customer){ 
    //re use Customer constructor 
    Customer.call(this,customer.name); 
    this.isVip=true; 
} 
//inherit the protype defined members 
VipCustomer.prototype=Object.create(Customer.prototype); 
VipCustomer.prototype.constructor=VipCustomer; 
VipCustomer.prototype.second=function(){ 
    console.log('this is second'); 
} 
var aCustomer = new Customer('Ben'); 
//update to VipCustomer 
aCustomer = Customer.createVipCustomer(aCustomer); 
aCustomer.second(); 
1

this.prototype не существует.

Если вы хотите добавить объект в список, используйте this.

Если вы хотите добавить собственность к прототипу, используйте Constructor.prototype.

Кроме того, obj функция (класс), не экземпляр,
Вы хотите создать экземпляр с помощью ключевого слова new, и вы должны назвать функцию конструктора как UpperCamelCase.

+0

@ Blue0500 Я изменил свой ответ. При рассмотрении вашего вопроса, похоже, вы хотели бы, чтобы экземпляр изменил тип при вызове определенной функции. – HMR

1

Это старый вопрос, но я думал, что добавлю свои два цента. Этот код пытается добавить функции в «прототип». Однако это можно сделать только для имени класса. У вас есть переменная, указывающая на анонимный класс. Для доступа к переменной анонимной переменной используйте 'proto'. Ниже приведено то же, что и ваш пример, кроме proto он «успешно». Хотя, я не вижу преимущества использования прототипов, подобных этому, поскольку прототип добавленных методов применяется только к анонимному экземпляру obj.http://jsbin.com/zapocamipi/edit?js,console

var obj = function() { } 

obj.__proto__.First = function() { 
    console.log("First Prototype"); 
    this.__proto__.Second = function() { 
     console.log(this); 
    } 
} 

obj.First(); 
obj.Second(); 
Смежные вопросы