JavaScript是一种基于对象(Object-based)语言, 和面向对象语言不同的是, 函数也是对象, 并且构造函数可以看成一种特殊的类, 任何函数都拥有prototype属性
prototype
- javascript函数拥有prototype属性, 函数名.prototype将得到一个对象, 这个对象拥有constructor属性, 函数名.prototype.constructor将得到该函数
- 构造函数的prototype是实例的原型
- 将方法添加到构造函数的prototype上, 这样通过new创建出来的实例对象就可以调用内存中的同一个方法从而避免了内存的浪费
原型链查找
- 实例对象可以通过打点访问它原型的属性和方法
function People(name, age) {...}; People.prototype.sex = "男"; let xiaoming = new People("小明", 12); console.log(xiaoming.sex); // "男" - hasOwnProperty方法检查对象是否真正拥有某属性或者方法
xiaoming.hasOwnProperty("name"); // true xiaoming.hasOwnProperty("age"); // true xiaoming.hasOwnProperty("sex"); // false - in方法检查某个属性或方法是否可以被对象访问, 不能检查是否是自己的属性和方法
"name" in xiaoming; // true "age" in xiaoming // true "sex" in xiaoming // fasle
原型链的终点
- javascript中的所有对象可以看成是由Object类通过new创建出来的实例对象, Object是所有实例对象的原型链的终点
function People() {...}; let xiaoming = new People(); console.log(xiaoming.__proto__.__proto__ === Object.prototype); // true console.log(Object.prototype.__proto__); // null