原型、原型链、继承

JavaScript 是一个基于原型链继承的面向对象编程语言。在继承的实现上和 Java 的等经典面向对象编程语言有很大的区别,在 ES6 中也加入了class关键字的支持,但是本质上就是一个语法糖。基于原型链的继承让 JavaScript 的继承实现更加灵活,这也是 JavaScript 必须掌握的基础知识。 原型 JavaScript 中每一个对象都有原型(也可以创建一个没有任何原型的对象),当使用new关键字实例化一个对象,该对象的原型也就指向了构造器的prototype属性。访问对象的属性的时候,首先会查找对象自身,如果该属性不存在,则会去查找对象的原型。这样,就可以将需要继承的属性放到原型对象中,让其所有子类都能够访问。 function Book(name) { this.name = name } Book.prototype.getName = function() { return this.name } const book = new Book('JavaScript') book.getName() // JavaScript 显式原型和隐式原型 JavaScript 的原型分为显式原型和隐式原型,两者之间最直观的区别是:显式原型是函数(构造器)的原型属性prototype,而隐式原型是所有对象实例的原型属性__proto__,即new Book().__proto__ === Book.prototype。 原型链 当访问对象属性的时候,首先回去查找对象自身是否包含该属性,如果没有,则会去__proto__中查找,如果__proto__中也不存在,则会继续去__proto__.__proto__中查找,直到访问到最顶层__proto__也就是Object.prototype。这一个过程就是通过原型链进行访问,一层一层的原型串成了一条链。 Object的原型对象没有原型,Object.prototype.__proto__为 null。 hasOwnProperty 和 in 如果要判断一个对象是否拥有某个属性的时候,可以使用Object.prototype.hasOwnProperty方法和in关键字。两者的区别在于,hasOwnProperty只会去查找对象自身是,不会去查找原型链,而in关键字会去查找原型链。 const book = new Book('JavaScript') book.hasOwnProperty('name') // true book.hasOwnProperty('getName') // false 'getName' in book // true 继承 JavaScript 的继承是通过原型实现的,可以通过给原型设置特定的属性,让其实例能够访问到(继承) const Book = { getName() { return this....

February 1, 2018 · 3 min · 438 words · Johnson