18

すべての Javascript オブジェクトにはプロパティがあるとよく言われますが、関数の場合にのみ値があるprototypeことがわかりました。foo.prototypefoo

Chrome と Firefox ではobj.__proto__、値があります。これは前述のprototypeプロパティですか? prototypeしかし、IE 9では機能しません(できる方法はありますか?)、プロパティによって、それはobj.prototype機能するはずだと思いましたか?

Object.getPrototypeOf(obj)このプロパティを示しているように見えることは理解していprototypeますが、それを取得するために特別なメソッドが必要なのはなぜですか? オブジェクトのプロパティperson.nameを取得する のようにしないのはなぜですか?nameperson


更新:ちなみに、コンストラクターなしのプロトタイプ継承で行われた次のコードのように、プロトタイプのようにobj.constructor.prototype見えることもありますが、そうでないこともあります: . 46)

var Person = {
    name: 'default value',
    getName: function() {
        return this.name;
    }
}

var reader = clone(Person);
console.log(reader.getName());
reader.name = "Ang Lee";
console.log(reader.getName());

function clone(obj) {
    function F() {};
    F.prototype = obj;
    return new F;
}

console.log("the prototype of reader is", Object.getPrototypeOf(reader));

console.log(Object.getPrototypeOf(reader) === reader.constructor.prototype);
console.log(Object.getPrototypeOf(reader) == reader.constructor.prototype);

console.log(Object.getPrototypeOf(reader) === reader.__proto__);
console.log(Object.getPrototypeOf(reader) == reader.__proto__);

結果は、最後の 4 行に対して false、false、true、true を示します。

4

2 に答える 2

16

すべての JavaScript オブジェクトには、しばしば [[prototype]] と呼ばれる内部の「プロトタイプ」プロパティがあり、直接継承元のオブジェクトを指します。これは、非標準__proto__プロパティによって FF および Chrome で公開されます。Object.getPrototypeOfこの内部プロパティのゲッターです。

すべての JavaScript 関数 [オブジェクト] にはプロパティprototypeがあり、[ほぼ] 空のオブジェクトで初期化されます。この関数をコンストラクターとして呼び出して新しいインスタンスを作成すると、その新しいオブジェクトの [[prototype]] はコンストラクターのprototypeオブジェクトを指します。

関数の [[prototype]] を取得すると (すべての関数はオブジェクトなので、1 つある)、Function.prototype関数がメソッド (bind、call、apply など) を継承するオブジェクトになります。関数プロトタイプが繰り返し連鎖する理由も参照してください。その上で。

于 2012-09-30T13:12:46.883 に答える
5

constructor持つすべてのオブジェクトのprototypeです。したがって、一部のfoobarまたはfoobar:

var foo = {};
console.log(foo.constructor.prototype); //=> Object
var bar = 5;
console.log(bar.constructor.prototype); //=> Number
function Foobar(){} 
var foobar = new Foobar; //Foobar used a constructor
console.log(foobar.constructor.prototype); //=> Foobar
于 2012-09-30T13:03:20.777 に答える