prototype
每个函数都有prototype属性。
函数的prototype属性指向一个对象,这个对象是调用该构造函数而创建的实例的原型。
__proto__
每一个对象都有的属性,__proto__ ,这个属性会指向该对象的原型。
所有构造函数都是Function的实例,所有原型对象都是Object的实例除了Object.prototype。
Object.__proto__ === Function.prototype;
Function.prototype.__proto__ === Object.prototype;
Object.prototype.__proto__ === null;
var F = function() {};
Object.prototype.a = function() {
console.log('a');
};
Function.prototype.b = function() {
console.log('b');
}
var f = new F();
f.a();
f.b();
F.a();
F.b();
解:
f 是对象,f.__proto__ === F.prototype F.prototype.__proto__ === Object.prototype
f.a() => a;
f.b() => 报错
F 是function, F.__proto__ === Function.prototype Function.prototype.__proto__ ===
Object.prototype
F.a() => a
F.b() => b
function Person(name) {
this.name = name
}
let p = new Person('Tom');
问题1:1. p.__proto__等于什么?
问题2:Person.__proto__等于什么?
解:
1.p 是对象,p.__proto__ === Person.prototype
2.Person 是方法,Person.__proto__ === Function.prototype === Function.__proto__
var foo = {},
F = function(){};
Object.prototype.a = 'value a';
Function.prototype.b = 'value b';
console.log(foo.a);
console.log(foo.b);
console.log(F.a);
console.log(F.b);
解:
foo 是对象,foo.a = 'value a' ,但foo不是方法, foo.b => undefined
F 是 方法, 可以访问到Function和Object的原型对象上的属性
F.a = 'value a'
F.b = 'value b'