据说所有Javascript对象都有一个prototype属性,但是如果foo是一个函数,我只看到foo.prototype?

nop*_*ole 17 javascript prototype

通常说每个Javascript对象都有一个prototype属性,但我发现foo.prototype只有foo函数才有值.

在Chrome和Firefox上,obj.__proto__有一个值 - 这是所说的prototype属性吗?但是在IE 9上,它不起作用(有某种方式可以吗?),我认为prototype属性,这意味着obj.prototype应该工作?

我明白这Object.getPrototypeOf(obj)似乎显示了这个prototype属性,但为什么需要一个特殊的方法来获取它?为什么不喜欢person.name,哪个是获取对象的name属性person


更新:顺便说一句,obj.constructor.prototype似乎有时候是原型,但有时候不是,如下面的代码用Prototypal继承完成而没有构造函数:(这个方法在Harmes和Diaz by Proress 2008的Pro Javascript Design Patterns一书中,p .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__);
Run Code Online (Sandbox Code Playgroud)

结果将显示最后4行的false,false,true,true.

Ber*_*rgi 15

每个JavaScript对象都有一个内部的"prototype"属性,通常称为[[prototype]],它指向它直接继承的对象.这是由非标准__proto__属性在FF和Chrome中公开的.Object.getPrototypeOf是这个内部财产的吸气剂.

每个JavaScript函数[object]都有一个属性prototype,用一个[几乎]空对象初始化.通过将其作为构造函数调用来创建此函数的新实例时,该新对象的[[prototype]]将指向构造函数的prototype对象.

如果你得到一个函数的[[prototype]](每个函数都是一个对象,所以它有一个),它将导致Function.prototype函数继承其方法的对象(如bind,call,apply等).另请参见为什么函数原型被重复链接?在那.

  • 几乎空的对象上有一个不可枚举的属性`constructor`,它指向构造函数.带有双方括号的符号来自[官方EcmaScript规范](http://ecma-international.org/ecma-262/5.1/#sec-8.6.2),它将此格式用于所有内部属性. (4认同)

Koo*_*Inc 5

它是 constructor 每个具有prototype. 所以对于一些foobarfoobar

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
Run Code Online (Sandbox Code Playgroud)