天天看點

原型對象(一)

原型對象就是解決構造函數建立對象時的弊端。

每一個構造函數都有一個prototype屬性,這個屬性指向的就是原型對象

<script>
      function Person(name, age, sex) {
        this.name = name;
        this.age = age;
        this.sex = sex;
      }

      var ldh = new Person("liudehua", 26, "man");
      console.log(ldh); //Person {name: "liudehua", age: 26, sex: "man"}
    //每一個執行個體對象都有constructor屬性,指向産生這個執行個體的構造函數,這句是錯的
    // 每一個執行個體對象都有constructor屬性,其實通路的是原型對象上的constructor。
    //原型最初隻包含constructor屬性,而該屬性也是共享的,是以可以通過對象執行個體通路。
    console.log(ldh.constructor === Person) //true
    //  Person.prototype.nike = "chuohoa"

    //工廠函數的弊端,構造函數來解決,構造函數的弊端原型對象來解決
    
    //列印原型對象
    console.log(Person.prototype);
    //   原型對象中有constructor,指向構造函數
    console.log(Person === Person.prototype.constructor); //true

    // 調用構造函數建立一個新執行個體後,
    // 該執行個體的内部将包含一個指針(内部屬性),
    // 指向構造函數的原型對象。
    // ECMA-262第5版中管這個指針叫[[Prototype]]。
    // 雖然在腳本中沒有标準的方式通路[[Prototype]],
    // 但Firefox、Safari和Chrome在每個對象上都支援一個屬性__proto__
    console.log(Person.prototype === ldh.__proto__)
    //__proto__,這個連接配接存在于執行個體與構造函數的原型對象之間,
    // 而不是存在于執行個體與構造函數之間


    // ldh.__proto__指向的是原型對象
    console.log(ldh.__proto__.constructor === Person) //true


   //ECMAScript 5增加了一個新方法,叫Object.getPrototypeOf(),
   //在所有支援的實作中,這個方法傳回[[Prototype]]的值    
   //說人話:也就是指向了原型對象呗,原型對象就是構造函數和執行個體之間的橋梁。
   console.log(Object.getPrototypeOf(ldh) == Person.prototype)//true
    </script>      
原型對象(一)
原型對象(一)