zoukankan      html  css  js  c++  java
  • 原型链与继承

     

      当谈到继承时,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

  • 相关阅读:
    UVA 12657 Boxes in a Line 双向链表模拟
    C语言单片和C#语言服务器端DES及3DES加密的实现
    关于TcpClient,Socket连接超时的几种处理方法
    拿来参考的学习计划
    faire la course
    今日法语2
    炸鱼
    今日法语
    今日疑问
    下周想做的菜
  • 原文地址:https://www.cnblogs.com/lulin1/p/9204301.html
Copyright © 2011-2022 走看看