原型与原型链

92 阅读1分钟

原型可以用来减少重复代码,节省内存空间:同一构造函数,不同实例之间,信息可以共享。

对象分为函数对象和普通对象,每一个对象上都有__proto__的属性,只有函数对象(箭头函数除外)上才有prototype属性。这个属性指向一个对象,这个对象的所有属性和方法都会被构造函数的实例所继承。

构造函数通过prototype指向原型对象

原型对象通过constructor指回构造函数

构造函数通过关键字new实例化成一个对象

实例化对象通过__proto__指向对应构造函数的原型对象。

function Animal () {}
Animal.prototype.age = 3
Animal.prototype.shout = 'hahahaha~'
Animal.prototype.sayName = function () {
  console.log('hello, i am ', this.age)
}
let cat = new Animal()
let dog = new Animal()
cat.sayName() // hello, i am 3
console.log('dog shout:', dog.shout)  // dog shout:hahahaha~
console.log(cat === dog)  // false
console.log(cat.prototype ===dog.prototype)  //true
console.log(Animal.prototype.constructor === Animal) // true
console.log(cat.__proto__ === Animal.prototype) // true
console.log(cat.__proto__) // {age: 3, shout: 'hahahaha~', sayName: ƒ, constructor: ƒ}

__proto__

查找实例方法用__proto__,当访问一个对象上没有的属性时,可是使用这个方法,去原型链上进行查找

prototype

JavaScript为prototype对象设置了三个方法,用来辅助prototype属性:

1)isPrototypeOf   用于检测某个对象的prototype是不是检测对象的原型,返回布尔值

  Cat.prototype.isPrototypeOf(cat2)  // 检测cat2是不是在Cat的原型链上

2)hasOwnProperty  用于检测对象的某个属性是否是自有属性而非继承属性,返回值为布尔值

 cat.hasOwnProperty('name')  //检测cat对象上有没有name属性
  1. in  用于判断实例是否具有某个属性,不管是私有还是继承来的,返回值为布尔值
"name" in cat  //检测name属性有没有在cat对象中或cat所在对原型链上