js作用链

先看js里面的new
这篇文章描述了js里面的new的作用
https://zhuanlan.zhihu.com/p/23987456

new之后会产生Foo对应的模板对象(Foo.prototype),再用模板对象(Foo.prototype)对象复制得到新的对象(b,c),然后调用模板对象(Foo.prototype)的constructor(即函数Foo)对新的对象进行修改
在这里插入图片描述

在这里插入图片描述
原型语言创建有两个步骤

使用”原型对象”作为”模板”生成新对象 :这个步骤是必要的,这是每个对象出生的唯一方式。以原型为模板创建对象,这也是”原型”(prototype)的原意。

初始化内部属性 :这一步骤不是必要的。通俗点说,就是,对”复制品”不满意,我们可以”再加工”,使之获得不同于”模板”的”个性”。

要清楚原型链,首先要弄清楚对象

普通对象:(eg a b)

最普通的对象:有__proto__属性(指向其原型链),没有prototype属性。

原型对象(Person.prototype 原型对象还有constructor属性(指向构造函数对象))

函数对象:(eg Foo())

凡是通过new Function()创建的都是函数对象。

拥有__proto__、prototype属性(指向原型对象)。

原型对象
每创建一个函数都会有一个prototype属性,这个属性是一个指针,指向一个对象(通过该构造函数创建实例对象的原型对象)。原型对象是包含特定类型的所有实例共享的属性和方法。原型对象的好处是,可以让所有实例对象共享它所包含的属性和方法。

原型对象属于普通对象。Function.prototype是个例外,它是原型对象,却又是函数对象,作为一个函数对象,它又没有prototype属性。

在这里插入图片描述
通过原型链实现继承

      //old
        function User(name,pass){
            this.name = name;
            this.pass = pass;
        }

        User.prototype.showName = function(){
            alert(this.name)
        }

        //old 继承
        function VIPUser(name,pass,level){
            User.call(this,name,pass);
            this.level = level;
        }

        VIPUser.prototype = new User();
        //修正一下构造函数
        VIPUser.prototype.constuctor = VIPUser;
        //这样的话,先复制了User模板,然后利用VIPUer()进行修改,实现对象的实例化

        VIPUser.prototype.shoewLevel = function(){
            alert(this.level)
        }

        
        //new
        class User2{
            constructor(name,pass){
                this.name = name;
                this.pass = pass;
            }

            showName(){
                alert(this.name)
            }
        }

        class VIPUser2 extends User2{
            constructor(name,pass,level){
                super(name,pass)
                this.level = level
            }

            shoewLevel(){
                alert(this.level)
            }
        }

发布了5 篇原创文章 · 获赞 0 · 访问量 61

猜你喜欢

转载自blog.csdn.net/qq_38105524/article/details/104076889