天天看点

原型对象(二)

<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      

继续阅读