• JavaScript 对象自有属性与原型属性学习


    1、自有属性与原型属性
    • 自有属性:构造函数本身的属性。通过对象的引用添加的属性。其他对象可能无此属性;即使有,也是彼此独立的属性
    • 原型属性:通过原型所定义的属性。用于共享属性和方法。从原型对象中继承来的属性,一旦原型对象中属性值改变,所有继承自该原型的对象属性均改变。
    //定义构造函数
    function Dog(name){
    //构造函数本身的属性 --自有属性
      this.name = name;
      this.sayName = function (){
        console.log("This name is " + this.name + "." );
      }
    }
    
    
    //通过构造函数的prototype方法新增属性或方法
    //通过原型所定义的属性 --原型属性
    Dog.prototype.numLegs = 4;
    
    /**
    通过构造函数创建Dog对象时,不仅具有自有属性,还具有构造函数的原型属性
    */
    let dog = new Dog('Jeff');
    console.log(dog);
    console.log(dog.name);  //Jeff
    console.log(dog.numLegs);  //4
    
    
    
    //注意:name属性的值可以动态改变,原型属性numLegs的值不能动态改变。
    let dog = new Dog('Tom');
    console.log(dog);
    console.log(dog.name);  //Tom
    console.log(dog.numLegs);  //4
    
    
    2、重写属性

    原有属性比原型属性的优先级高,原型属性不能重写原有属性的值。
    可以给对象增加与原型属性名相同的自有属性,后续会默认访问自有属性。

    
    //定义构造函数
    function Dog(name){
      this.name = name;
    }
    
    //通过原型定义name属性
    Dog.prototype.name = "Tom";
    Dog.prototype.numLegs = 4;
    
    //创建对象并定义自有属性name
    let dog =new Dog("Jeff");
    
    //自有属性与原型属性同名时,默认访问的是自有属性的值 -> 自有属性的优先级高于原型属性
    console.log(dog.name);  //Jeff
    
    //删除对象的自有属性
    delete dog.name;
    
    //重新访问对象的属性,此时获取的是对象的原型属性,通过测试发现 自有属性比原型属性优先级高,但不会覆盖掉原型属性
    console.log(dog.name);  //Tom
    
    //给对象增加与原型属性名相同的自有属性,后续会默认访问自有属性。
    console.log(dog.numLegs);  //4
    dog.numLegs = 6;
    
    console.log(dog.numLegs);  //6
    
    3、检测属性是自有属性还是原型属性
    • 使用hasOwnPropertype()方法检测对象属性是否是自有属性:

    Object.hasOwnProperty(property)方法
    作用: 判断指定属性是否是对象的自有属性
    property: 表示指定属性名称
    返回值为布尔值,true 表示存在指定的自有属性,false表示不存在指定的自有属性

    • 使用in关键字检查属性是否是对象及其原型中的属性
    function Bird(name) {
      this.name = name;  //own property
    }
    
    Bird.prototype.numLegs = 2; // prototype property
    let duck = new Bird("Donald");
    
    let ownProps = [];
    let prototypeProps = [];
    
    for (let property in duck) {
      if(duck.hasOwnProperty(property)) {
        ownProps.push(property);
      } else {
        prototypeProps.push(property);
      }
    }
    
    console.log(ownProps);
    console.log(prototypeProps);
    
    console.log("name" in duck );  //true
    console.log("numLegs" in duck );  //true
    

    这世上所有美好的东西,都需要踮起脚尖。
  • 相关阅读:
    [Web 前端] CSS 盒子模型,绝对定位和相对定位
    [Android Pro] 跨平台反编译工具 jadx (ubuntu亲测 可用)
    [Web 前端] Jquery 复制元素,并修改属性, 追加到另一个元素后面
    [Web 前端 ] Jquery attr()方法 获取或修改 对象的属性值
    [Web 前端] Jquery实现可直接编辑的表格
    [Web 前端] td长度固定,内容过长,超过部分用省略号代替
    [Network] okhttp3与旧版本okhttp的区别分析
    [Android Pro] AndroidStudio IDE界面插件开发(进阶篇之Editor)
    graph embedding 使用方法
    win10 'make' 不是内部或外部命令
  • 原文地址:https://www.cnblogs.com/XMYG/p/15268746.html
Copyright © 2020-2023  润新知