2010-06-19 4 views
2

У меня есть этот тип кода для прототипного наследования в Javascript.Есть ли способ изменить прототип внутри функции в Javascript?

function A() { 
    this.a = 1; 
} 
function B() { 
    someEl.innerHTML(this.a); 
} 
B.prototype = new A(); 

Однако, мне интересно, если есть лучший способ сделать это, желательно тот, который приносит объявление прототипа в декларации B.

Я попытался установить this.prototype в B, но он только что показал this.a как undefined.

Итак, есть ли лучший способ сделать это?

ответ

4

prototype свойство следует использовать только в constructor functions, this.prototype не имеет смысла, потому что this только новый экземпляр объекта, а не конструктор.

Назначение prototype внутри самого конструктора не является хорошей идеей, так как это назначение будет выполняться каждый раз при создании нового объекта (по new B();).

Ваш код кажется совершенно действительным для меня, единственное, что вы должны знать, что если вы замените prototype свойство конструктора, как вы делаете это с B.prototype = new A(); на constructor свойство объекта экземпляров B, будет указывать на A.

Обычно рекомендуется, чтобы восстановить эту собственность, например:

function A() { 
    this.a = 1; 
} 

function B() { 
    someEl.innerHTML(this.a); 
} 

B.prototype = new A(); 
B.prototype.constructor = B; // restore the `constructor` property 

var foo = new B; 
foo.constructor === B; // true 

Дайте Посмотрите:

0

Try:

function A() { 
    this.a = 1; 
} 
function B() { 
    this.prototype = new A(); 
    someEl.innerHTML(this.A.a); //notice A.a 
} 
+2

Это работает, но при условии, что это означает различие между прототипом унаследованных переменных и его собственными членами, вероятно, это лекарство хуже проблемы (объявление вне функции). – Macha

+0

Я не знаю другого способа сделать что-то подобное. Невозможно установить прототип функции до ее объявления. Метод, который вы в настоящее время используете, - это «по-книжке». – tcooc

+0

Назначение 'this.prototype' не имеет смысла, свойство' prototype' должно использоваться в [конструкторских функциях] (https://developer.mozilla.org/en/Core_JavaScript_1.5_Guide/Working_with_Objects#Using_a_Constructor_Function), ' this' value - просто новый экземпляр объекта. – CMS

0
function MyClass() { 
    this.initialize(); 
} 

MyClass.prototype = { 
    initialize: function() {    // adding a function name 
     this.some_var = "Blue";   // makes debugging easier 
    }, 
    tell_color: function() { 
     alert(this.color); 
    }, 
    color: "red" 
} 

var instance = new MyClass(); 
instance.tell_color(); 

Это была не моя идея, но я не знаю больше, где я нашел его.

0

Наследование в JS немного странно, но все остальные t, что вы никогда не должны ставить прототип внутри конструктора. Точка прототипированных функций/vars заключается в том, что у вас есть единственный экземпляр этой функции для ВСЕХ экземпляров указанного класса. Точно так же это хорошо для классовых vars, сингулярного значения, которое каждый экземпляр будет ссылаться.

Действительно, вы должны сделать класс B наследует от класса A:

function B(){ 
    this.object = new A(); 
} 

B.prototype.a = function(){ 
    return object.a; 
} 

, который может быть немного раздражает, так как вы должны затем создать новый Геттеры/сеттеры, buuuuuuuttttt, если вы чувствуете себя немного приключений, вы может построить что-то вроде этого ......

function breakApart(what){ 
    var functions = []; 
    var properties = []; 

    for(property in what){ 
     if(typeof what[property] == 'function'){ 
      functions.push({'name':property,'value':what[property]}); 
     }else{   
      properties.push({'name':property,'value':what[property]}); 
     } 
    } 

    var data = [ 
     {'title':'functions','data':functions}, 
     {'title':'properties', 'data':properties} 
     ]; 

    return data; 
} 

Добавить несколько Eval() вызывает и определенную логику, и вы можете сделать эту функцию построить вам новые геттеры/сеттеры ссылки/функции.

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