238 字
1 分钟
javascript原型链
JavaScript原型链
1. prototype - 函数的”儿子模板”
只有函数才有prototype! 它是给将来new出来的实例用的。
function Dog(name) { this.name = name;}
// prototype是函数的属性,用来给实例共享方法Dog.prototype.bark = function() { console.log(this.name + "汪汪汪");};
var dog1 = new Dog("旺财");var dog2 = new Dog("来福");
dog1.bark(); // "旺财汪汪汪"dog2.bark(); // "来福汪汪汪"
// dog1和dog2共享同一个bark方法// 这个方法存在Dog.prototype里2. __proto__ - 每个对象的”爸爸”引用
每个对象都有__proto__,它指向创建这个对象的构造函数的prototype。
var dog1 = new Dog("旺财");
// dog1的__proto__指向Dog.prototypedog1.__proto__ === Dog.prototype; // true
// Dog.prototype的__proto__指向Object.prototypeDog.prototype.__proto__ === Object.prototype; // true
// Object.prototype的__proto__指向null(原型链尽头)Object.prototype.__proto__ === null; // true简单记: __proto__就是”我爹是谁”的指针,顺着它往上找就是原型链。
3. constructor - 指向”创造我的构造函数”
每个prototype对象都有个constructor属性,指回构造函数自己。
function Dog(name) { this.name = name;}
// Dog.prototype.constructor 指向 Dog 自己Dog.prototype.constructor === Dog; // true
// 所以实例可以通过constructor找到自己的构造函数var dog1 = new Dog("旺财");dog1.constructor === Dog; // true// dog1没有constructor,是顺着__proto__找到Dog.prototype上的constructor栗子
var arr = [1, 2, 3];
// arr是Array的实例arr.__proto__ === Array.prototype; // true
// Array.prototype上有所有数组方法Array.prototype.push; // function push()Array.prototype.pop; // function pop()
// arr能用这些方法,因为顺着__proto__找到的arr.push(4); // arr.__proto__.push.call(arr, 4)
// Array.prototype的__proto__指向Object.prototypeArray.prototype.__proto__ === Object.prototype; // true
// Array.prototype.constructor指向Array自己Array.prototype.constructor === Array; // true
// arr.constructor也是Arrayarr.constructor === Array; // true4.三条链:
实例.__proto__→构造函数.prototype构造函数.prototype.constructor→构造函数构造函数.prototype.__proto__→上一层原型
所以说真正的原型链指的就是prototype。
prototype很简单,没啥区别!就是个普通对象! 唯一特殊的是:用new创建实例时,实例的__proto__会自动指向它。
掌握了原型链,你就能摸清js实现class的底层原理,顺便能干一些偷鸡摸狗的事情🤣
部分信息可能已经过时









