天天看點

原型對象(二)

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

      var ldh = new Person("liudehua", 26, "man");
      //構造函數執行個體對象可以通路原型對象上公共的屬性和方法。
      //問題:1、執行個體對象不能修改原型對象上的屬性和方法。
      //2、命名沖突了,執行個體對象上的會覆寫原型對象。
      Person.prototype.name = "nikkke";
      console.log(Person.prototype);
      console.log(ldh); //Person {name: "liudehua", age: 26, sex: "man"}
      console.log(ldh.name); //liudehua
      var zkf = new Person();
      console.log(zkf); //Person {name: undefined, age: undefined, sex: undefined}
      console.log(zkf.name); //undefined  命名沖突了直接到執行個體對象就不再往上追溯了

      function Book() {}
      Book.prototype.name = "戰争與和平";
      var book1 = new Book();
      book1.name = "傲慢與偏見";
      console.log(book1); //book {name: "傲慢與偏見"}
      console.log(book1.name); //傲慢與偏見
      //   使用delete操作符則可以完全删除執行個體屬性,進而讓我們能夠重新通路原型中的屬性
      delete book1.name;
      console.log(book1); //Book {}
      console.log(book1.name);//戰争與和平
      var book2 = new Book();
      console.log(book2); //Book {}
      console.log(book2.name); //戰争與和平


      //使用hasOwnProperty()方法可以檢測一個屬性是存在于執行個體中,還是存在于原型中。
      //這個方法(不要忘了它是從Object繼承來的)隻在給定屬性存在于對象執行個體中時,才會傳回true
      function Mobile() {};
      var iphone = new Mobile();
      Mobile.prototype.age = "12";
      iphone.name = "8plus";
      iphone.age = '0'
      console.log(iphone.age)
      console.log(iphone.hasOwnProperty('name')) //true
      console.log(iphone.hasOwnProperty('age')) //false


    //in操作符會在通過對象能夠通路給定屬性時傳回true,無論該屬性存在于執行個體中還是原型中
    console.log('age' in iphone) //true
    console.log('name' in iphone) // true

    //利用hasOwnProperty()和in判斷屬性屬于執行個體還是原型
    function handleProperty(obj,proper) {
        return obj.hasOwnProperty(proper) && (proper in obj)
    }
    console.log(handleProperty(iphone,"age")) //true      

繼續閱讀