原型链与继承

 

  当谈到继承时,JavaScript 只有一种结构:对象。每个实例对象(object )都有一个私有属性(称之为 __proto__)指向它的原型对象(prototype)。该原型对象也有一个自己的原型对象 ,层层向上直到一个对象的原型对象为 null。根据定义,null 没有原型,并作为这个原型链中的最后一个环节。 

  几乎所有 JavaScript 中的对象都是位于原型链顶端的Object的实例。

  从 ECMAScript 6 开始,[[Prototype]] 可以通过Object.getPrototypeOf()Object.setPrototypeOf()访问器来访问。这个等同于 JavaScript 的非标准但许多浏览器实现的属性 __proto__。(当使用 obj.__proto__ 时,可以理解成返回了 Object.getPrototypeOf(obj))

function Graph() {
  this.vertices = [];
  this.edges = [];
}

Graph.prototype = {
  addVertex: function(v){
    this.vertices.push(v);
  }
};

var g = new Graph();
g.__proto__ == Graph.prototype   //  与 Object.getPrototypeOf(g) == Graph.prototype 等价
//true

  ps:

function Person() {

}

var person = new Person();

typeof Person; //function
typeof person; //object

  1.每个函数都有一个 prototype 属性,prototype是函数才会有的属性。

  2.每一个JavaScript对象(除了 null )都具有的一个属性,叫__proto__,这个属性会指向该对象的原型。

    

(1)对象的原型和原型链

  对象的原型对象都是 Object.prototype,Object.prototype 的原型是 null。

var o = {a: 1};
Object.getPrototypeOf(o) == Object.prototype
//true 即:对象 o 的原型是 Object.prototype
Object.getPrototypeOf(Object.prototype) 
//null 即:Object.prototype 的原型是 null

// 原型链如下:
// o ---> Object.prototype ---> null

  

(2)数组的原型和原型链

  数组的原型都是 Array.prototype,Array.prototype 的原型是 Object.prototype。

var a = [1,2,3]
Object.getPrototypeOf(a)  ==  Array.prototype;
//true 即:数组 a 的原型是 Array.prototype
Object.getPrototypeOf( Array.prototype ) == Object.prototype;
//true 即:数组原型的原型是对象原型 Array.prototype

// 原型链如下:
// a ---> Array.prototype ---> Object.prototype ---> null

  

(3)函数的原型和原型链

  函数的原型都是 Function.prototype,Function.prototype 的原型是 Object.prototype。

function f(){
  return 2;
}
Object.getPrototypeOf(f) == Function.prototype
//true 即:函数 f 的原型是 Function.prototype
Object.getPrototypeOf(Function.prototype) == Object.prototype
//true 即:函数原型的原型是 Object.prototype

// 原型链如下:
// f ---> Function.prototype ---> Object.prototype ---> null

  

 hasOwnProperty :

  遍历对象的属性时,原型链上的每个可枚举属性都会被枚举出来。要检查对象是否具有自己定义的属性,而不是其原型链上的某个属性,则必须使用所有对象从Object.prototype继承的 hasOwnProperty 方法。

  hasOwnProperty 是 JavaScript 中唯一处理属性并且不会遍历原型链的方法。

参考: https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Inheritance_and_the_prototype_chain

原文地址:https://www.cnblogs.com/lulin1/p/9204301.html