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 に答える
JavaScript 関数はオブジェクトであり、関数を呼び出すための 2 つの便利なメソッドがあります。
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
.
たぶん、これはあなたが達成しようとしていることを単純化しすぎているのかもしれません... o1.init() を o2 init 関数に配置すると機能しますか?
o2.init = function(){
// how would I call my ancessors init()?
alert('o2');
o1.init();
};
好奇心から、「ancessors」は「ancestor's」のスペルミスでしたか、それとも「ancessors」はここで特定の何かを意味しますか? o2 の「親」オブジェクトのことですか?
Object.getPrototypeOf
それをサポートするブラウザーでは、次のように関数を使用できます。
o2.init = function(){
Object.getPrototypeOf(this).init.call(this);
alert('o2');
};
o2
これは( )のプロトタイプを取得し、他の言語の a と同様に、o1
そのinit
メソッドをこの ( ) に適用します。o2
super.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/