Как добраться до переопределенного метода моего предка, используя Crockfords's Object.create () (Javascript) - PullRequest
4 голосов
/ 01 ноября 2009
if (typeof Object.create !== 'function') {
    Object.create = function (o) {
        function F() {}
        F.prototype = o;
        return new F();
    };
}
var o1 = {};
o1.init = function(){
   alert('o1');
};
var o2 = Object.create(o1);
o2.init = function(){
   // how would I call my ancessors init()?
   alert('o2');
};
o2.init();

Ответы [ 3 ]

3 голосов
/ 01 ноября 2009

Функции JavaScript являются объектами и имеют два полезных метода для вызова функции:

Function.call(scope, [arg1, ...])
Function.apply(scope, args)

Вы можете использовать один из них для вызова родительской реализации, явно передав this в качестве параметра scope, так что в родительской реализации this ссылается на дочерний объект:

var o1 = {
    name : "One",
    init : function() {
        alert("o1: " + this.name);
    }
};

var o2 = Object.create(o1);
o2.name = "Two";
o2.init = function() {
    o1.init.call(this);
    alert("o2: " + this name);
};

Это предупредит: o1: Two и o2: Two.

1 голос
/ 13 ноября 2009

Может быть, это слишком упрощает то, что вы пытаетесь достичь ... поместит ли o1.init () в функцию инициализации o2?

o2.init = function(){
   // how would I call my ancessors init()?
   alert('o2');
   o1.init();
};

Из любопытства были ли "предшественники" орфографической ошибкой для "предков" или "предшественники" означают здесь что-то конкретное? Вы имели в виду "родительский" объект o2?

0 голосов
/ 19 октября 2012

В браузерах, которые его поддерживают, вы можете использовать функцию Object.getPrototypeOf, например:

o2.init = function(){
    Object.getPrototypeOf(this).init.call(this);
    alert('o2');
};

Это позволит получить прототип o2 (o1) и применить к нему его метод init (o2), как и super.init() в других языках.

UPDATE:

Функция Object.getPrototypeOf может быть реализована так:

if ( typeof Object.getPrototypeOf !== "function" ) 
{
    if ( typeof ({}).__proto__ === "object" ) 
    {
        Object.getPrototypeOf = function(object)
        {
            return object.__proto__;
        };
    } 
    else 
    {
        Object.getPrototypeOf = function(object)
        {
            // May break if the constructor has been tampered with
            return object.constructor.prototype;
        };
    }
}

Найдено по этой ссылке: http://ejohn.org/blog/objectgetprototypeof/

...