2012-06-18 2 views
2

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

function A() {} 

A.prototype = { 
    nw: function(t) { 
     return new t(A); 
    } 
} 

Если ребенок (например, B) по наследству прототипа будет вызывать функцию ЯО, и я хочу, чтобы возвратить новый T (B), то, что я должен заменить А в новом т (А) с передать правильный параметр?

Что-то вроде 'return new t (this)'?

B.nw (C) вернет новый C (B).

+0

Что вы хотите передать в 't'? Экземпляры текущего объекта, родительского объекта или корневого объекта? – abuduba

+0

Родительский объект :) – Igor

+0

вы можете попробовать 'this.prototype.constructor', то есть мы условно разместим метод конструктора. Теперь, назначив прототип, я сомневаюсь, что это сработает, вы должны использовать дизайн, похожий на то, что генерирует coffescript. – Eric

ответ

0

Uh, другие ответы только выглядят сложными. Похоже, вы просто хотите:

function A() {} 

A.prototype = { 
    constructor: A, 

    nw: function(t) { 
     return new t(this.constructor); 
    } 
} 
0

, если я понимаю правильно, это то, что вы хотите:

function A() {} 

A.__proto__ = { 
    log: function(t) { 
     return new t(this); 
    } 
} 

Если запустить следующий код

A.log(function(obj){ 
    console.log(obj); 
}); 

Он будет записывать

+0

'__proto__' не является стандартным. – Ashe

+0

не является прототипом – Luka

+0

Да, это так. См. [ECMA-262, §4.2.1 Объекты] (http://es5.github.com/#x4.2.1): «* Каждый конструктор - это функция, которая имеет свойство с именем« prototype », которое используется для реализовать * наследование на основе прототипа * и * общие свойства. " Обратите внимание, что '__proto__' никогда не упоминается. – Ashe

0

Вы можете реализовать простое наследование механизм:

var Class = function(parent){ 
    var f = function(){}; 

    if(typeof parent == 'function'){ 
     f.prototype = new parent; 
    }else if(parent) { 
     f.prototype = parent; 
    } 

    f.prototype.__parent = parent; // :) 
    f.prototype.__root = (parent && parent.prototype && parent.prototype.__root) || parent || f; // :) 
    return f 
}; 

А теперь:

var A = Class(), 
     B = Class(A), 
     C = Class(B), 

     objA = new A, 
     objB = new B, 
     objC = new C; 

objC.__parent == B; // true; 
objB.__parent == A; // true 

(objC.__root == objB.__root) && (objA.__root == A); // true; 

Однако, вы можете конкретный прототип для корневого объекта (ваш случай):

var A = Class({ 
      nw: function(t) {     
        // What you like here? :)  

        return new t(this.__parent); 
        //return new t(this.constructor); 
        //return new t(this.__root); 
      } 
      }); 
Смежные вопросы