5
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();
4

3 に答える 3

3

JavaScript 関数はオブジェクトであり、関数を呼び出すための 2 つの便利なメソッドがあります。

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

これらのいずれかを使用して親実装を呼び出し、パラメーターthisとして明示的に渡すことができるため、親実装で子オブジェクトを参照できます。scopethis

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.

于 2009-11-01T13:39:22.837 に答える
2

たぶん、これはあなたが達成しようとしていることを単純化しすぎているのかもしれません... o1.init() を o2 init 関数に配置すると機能しますか?

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

好奇心から、「ancessors」は「ancestor's」のスペルミスでしたか、それとも「ancessors」はここで特定の何かを意味しますか? o2 の「親」オブジェクトのことですか?

于 2009-11-13T09:11:44.707 に答える
0

Object.getPrototypeOfそれをサポートするブラウザーでは、次のように関数を使用できます。

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

o2これは( )のプロトタイプを取得し、他の言語の a と同様に、o1そのinitメソッドをこの ( ) に適用します。o2super.init()

アップデート:

関数は次の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/

于 2012-10-19T14:26:14.680 に答える