js的原型和原型链
prototype
每个函数都有一个 prototype 属性
每一个JavaScript对象(null除外)在创建的时候就会与之关联另一个对象,这个对象就是我们所说的原型,每一个对象都会从原型"继承"属性。
proto
每一个JavaScript对象(除了 null )都具有的一个属性,叫proto,这个属性会指向该对象的原型
constructor
每个原型都有一个 constructor 属性指向关联的构造函数 实例原型指向构造函数
原型链
细节分析
prototype
每个函数对象都有prototype属性,只有函数才有,通过bind()绑定的没有,prototype属性是一个指针, 它指向原型对象,原型对象的好处是可以让所有对象实例共享它所包含的属性和方法;
proto
每个实例对象(构造函数的实例)都有__proto__属性,__proto__指向原型对象,一般用来查看原型对象,修改__proto__对象不会对同一个构造函数的其他实例造成影响,但修改__proto__对象的属性会对同一个构造函数的其他实例造成影响,原因的话我个人认为是跟堆内存跟栈内存有关;
constructor
constructor属性是对象所独有的,每个原型对象都指向该对象的构造函数,
总结
实例对象的 _ _proto _ _ 指向构造函数.prototype ;
构造函数.prototype的 __ proto __ 指向Object.prototype;
Object.prototype的 __ proto __ 指向null;
操作示例
function Star(uname, age) {
this.uname = uname;
this.age = age;
}
Star.prototype.movie = function () {
console.log('我会演电影');
}
var zxy = new Star('张学友', 19);
zxy.__proto__.movie = function () {
console.log('我会唱歌');
}
function a() { }
var yyy = new Star('张学友', 19);
var ab = 1
console.log(zxy.movie, zxy.__proto__.movie, yyy.__proto__.movie);