美文网首页
原型和原型链

原型和原型链

作者: my木子 | 来源:发表于2021-05-15 17:22 被阅读0次

    例子

        // 父类
        class Person {
          constructor(name) {
            this.name = name;
          };
          sleep() {
            console.log(`${this.name}睡觉了`);
          };
        };
    
        // 子类
        class Student extends Person { // 继承父类的属性和方法
          constructor(name, subject) {
            super(name);  // 调用父类的构造函数
            this.subject = subject;
          };
          study() {
            console.log(`${this.name}在学习${this.subject}`);
          };
        };
    
        // 创建 Student 的实例
        let zs= new Student('张三', '数学');
    
        console.log(zs);
        console.log(zs.name);
        console.log(zs.subject);
        zs.study();
        zs.sleep();
    
        // 打印对象的属性和方法
        console.dir(Student);
        
        console.log(zs.__proto__ === Student.prototype); // true
    
        console.log(zs instanceof Student); // true
    
        console.log(zs.hasOwnProperty('name')); // true
    
        // 获取原型
        console.log(zs.__proto__);
        console.log(zs.constructor.prototype);
        console.log(Object.getPrototypeOf(zs));
    
    Student 的实例 console.log(zs); Student 的属性和方法 console.dir(Student);

    原型、构造函数、实例、原型链的关系

    原型、构造函数、实例、原型链的关系

    原型

    • Student.prototype 就是原型,它是一个对象,我们也称它为原型对象
    • 原型的作用,给函数和对象添加可共享(继承)的方法、属性
    • 获取原型的方法 zs.__proto__zs.constructor.prototypeObject.getPrototypeOf(zs)

    隐式原型

    • 引用类型都有一个隐式原型 __proto__ 属性,属性值是一个普通的对象
    • 引用类型隐式原型 zs.__proto__ 的属性值指向它的构造函数的显式原型 Student.prototype 属性值

    原型链

    • 调用某个对象的属性或方法时,如果这个对象本身没有这个属性或方法,那么它会去它的隐式原型
      __proto__ 找,原型与原型层层相链接的过程即为原型链
    • Object.prototype 的隐式原型指向 null

    __proto__prototype 的区别和联系

    • 所有对象都有 __proto__ 属性,函数这个特殊对象除了具有 __proto__ 属性,还有特有的原型属性 prototypeprototype 对象默认有两个属性,constructor 属性和 __proto__ 属性
    • prototype 属性可以给函数和对象添加可共享(继承)的方法、属性,而 __proto__ 是查找某函数或对象的原型链方式
    • constructor 这个属性包含了一个指针,指回原构造函数

    instanceof

    • 检查 zs 是否是 Student 的实例

    Object.setPrototypeOf(obj, prototype)

    • 设置一个指定的对象的原型到另一个对象或 null
    • obj 要设置其原型的对象
    • prototype 该对象的新原型(一个对象或 null)
        let parent = {
          name: 'parent',
          show() {
            console.log(this.name)
          }
        }
        let son = {
          name: 'son'
        }
    
        Object.setPrototypeOf(son, parent)
        son.show()  // son
    

    Object.getPrototypeOf(object)

    • 返回指定对象的原型
    • object 要返回其原型的对象
        let obj1 = {}
        let obj2 = {}
        console.log(Object.getPrototypeOf(obj1) === Object.getPrototypeOf(obj2)) // true
    

    Object.create()

    • 创建一个新对象,使用现有的对象来提供新创建的对象的 __proto__
        let obj = {
          num: 20
        }
        let obj1 = Object.create(obj, {
          name: {
            value: '张三'
          }
        })
        console.log(obj1)
        console.log(obj1.num) // 20
    
        // 创建没有原型的对象
        let obj2 = Object.create(null, {
          name: {
            value: '张三'
          }
        })
        console.log(obj2) // {name: "张三"}
    

    parentObject.isPrototypeOf(sonObject)

    • sonObject 对象是否在 parentObject 对象的原型链上,返回一个布尔值
        let parent = {
          name: 'parent'
        }
        let son = {
          name: 'son'
        }
    
        Object.setPrototypeOf(son, parent)
        console.log(parent.isPrototypeOf(son)) // true
    

    Object.prototype.hasOwnProperty(prop)

    • 返回一个布尔值,指示对象自身属性中是否具有指定的属性
    • prop 要检测的属性的 String 字符串形式表示的名称,或者 Symbol
        let obj1 = {
          age: 20
        }
        let obj2 = {
          age: 10,
          name: '张三'
        }
        Object.setPrototypeOf(obj1, obj2)
        console.log(obj1)
        console.log(obj1.age) // 20
        console.log(obj1.hasOwnProperty("age"))  // true
        console.log(obj1.hasOwnProperty("name"))   // false
        console.log("=========================")
    
        for (const key in obj1) {
          // console.log(key) // age name
          if (Object.hasOwnProperty.call(obj1, key)) {
            console.log(key)  //  age
          }
        }
    

    Object.assign(target, ...sources)

    • 将所有可枚举属性的值从一个或多个源对象分配到目标对象,它将返回目标对象
    • target 目标对象
    • sources 源对象(选填)
        const target = { a: 1, b: 2 };
        const source1 = { b: 4, c: 5 };
        const source2 = { d: 8, e: 9 };
    
        const returnedTarget = Object.assign(target, source1, source2);
    
        console.log(target);  // {a: 1, b: 4, c: 5, d: 8, e: 9}
    
        console.log(returnedTarget);  // {a: 1, b: 4, c: 5, d: 8, e: 9}
    

    相关文章

      网友评论

          本文标题:原型和原型链

          本文链接:https://www.haomeiwen.com/subject/cwzhjltx.html