js的new运算符做了哪些事情(0基础知识精细分解系列)

<script>
    //依赖的前备知识:1/ 值类型和引用类型的存储区别 (有别名,地址,指向等概念)
    // 2/ 函数 -》 js中也用函数表示类
    // 3/ 赋值
    // 4/ 实例概念:new Class1(Class1是个函数),可以构造一个对象,这个对象称为Class1类的实例。可见:实例就是对象,进一步说是属于某类的对象。
    // 5/ call方法作用
    // 6 上下文this 的本质: 函数是谁调用的,这个this就指向谁 【好记:指向函数的调用者】
    // 7 结合5和6,call 的本质是改变函数里的上下文
    function Person(name,age){
        this.name = name;
        this.age = age;
        this.sayName = function(){
            console.log(this.name);
        }
    }
    //8 原型/原型链的概念和new 一起认知即可。 【在下面person2.__proto__后面一个注释中也有说】
    Person.prototype.sayAge = function() {
        console.log(this.age);
    };
    // 创建 对象(此对象创建出来后用person1来指向它,创建完后它是Person类的实例) 的方法1:
    //[teacher: 此知识点基于堆区和栈区的概念。 new Person表达式是在堆区创建出一个Person类的实例,
    // 实例的意思还需要跟学生强调一下(某个类的实例就是属于某个类的对象,比喻人类和个体人);
    // 创建完成后执行赋值person1 =, 这是把刚才创建的对象的地址(基于引用类型的地址概念)赋值给变量,
    // 变量存的只是个地址]
    var person1 = new Person('gaos',23);
    person1.sayName();
    person1.sayAge();
    console.log( Person === Person.prototype.constructor );//true
    console.log( person1 instanceof Person);//true
    console.log( person1.constructor === Person );//true


    // 创建对象方法2: new 的操作相当于以下三步
    var person2={}; //初始化一个对象person2。
    //以下说的原型就是原型对象,平常习惯把对象省略,称其为原型。 它本质上是个对象
    console.dir(person2); //Object; 本来person2的原型是 Object
    person2.__proto__ = Person.prototype; //把person2的原型指向Person的原型上.  复习想想引用类型的赋值是怎么回事(别名,地址。指针指向)
    /**
     * 注:初学者不知道这个是啥:__proto__。 这个就是原型链的概念:
     * 对象找属性的时候先在自己的内部找,比如如果 person2={ name:1},那么 person2.name 就先找到{}里的name, 找不到怎么办?
     * 就通过原型链上找,原型链就是这个__proto__属性。
     * 上面那个如果是找 sayAge (person2.sayAge)就能在原型链对象(__proto__指向的那个对象) 中找到了。
     *
     * 原型的概念:
     * js中每个函数(当作类)都有原型,如 Person.prototype 表示 Person的原型。
     */
    Person.call(person2,'gaos',23); //构造person2,也可以称之为初始化person2。 复习call的用法,函数.call 会把函数里的上下文(this)指向call传入的第一个参数指定的对象。

    person2.sayName();
    person2.sayAge();
    console.log( Person === Person.prototype.constructor );//true
    console.log( person2 instanceof Person);//true
    console.log( person2.constructor === Person );//true
</script>

猜你喜欢

转载自andrewstz.iteye.com/blog/2305934
今日推荐