javascript创建对象

工厂模式

解决了创建多个类似对象的问题,但没有解决对象的标识问题。

    // 工厂模式
    function creatPerson(name) {
        let o = new Object();
        o.name = name;
        o.sayName = function () {
            console.log(this.name)
        }
        return o
    }
    let person = creatPerson('job');

构造函数的模式

    // 构造函数模式
    function Person(name, age) {
        this.name = name;
        this.age = age;
        this.sayName = function () {
            console.log(this.name)
        }
    }
    let person1 = new Person('job', 12)

new操作符过程发生了什么

  1. 在内存中创建一个对象
  2. 这个对象内部的__ proto __特性,被赋值为构造函数的prototype属性
  3. 构造函数内部this被赋值为这个新对象(即this指向新对象)
  4. 执行构造函数内部代码,给新对象添加属性
  5. 如果构造函数返回非空对象,则返回该对象,否则返回刚刚创建的对象。
    // ?new的时候发生了什么
    function selfNew() {
        let obj = Object.create({});
        obj.__proto__ = Person.prototype;
        let o = Person.call(obj);
        return o ? obj : o;
    }

new出来的实例构造器即construction属性均指向Person,用于标识对象类型。

优点:可以确保实例被标识为特定类型。

问题:方法会在每个实例上都创建一遍,可以将方法放置到函数外,或者使用原型模式解决。

原型模式

每个函数都会创建一个prototype属性,包含应该由特定引用类实例共享的属性和方法。这个对象就是通过构造函数创建对象的原型。

    // 原型模式
    function PresonProto() {

    }
    PresonProto.prototype.name = "person";
    PresonProto.prototype.age = 239;
    PresonProto.prototype.name = "person";
    PresonProto.prototype.sayName = function () {
        console.log(this.name)
    };
     function Test(){

     }
     console.log(typeof Test.prototype)//object
     console.log(Test.prototype)
Object constructor: ƒ Test() __proto__: Object
 

使用 原型的好处就是,在他上面定义的属性和方法都可以被对象实例共享。

  1. 理解原型

    1. 创建一个函数,就会按特定规则为函数创建prototype属性(指向原型对象)
    2. 默认情况下所有原型对象会自动获得一个名为constructor属性,指回与之关联的构造函数。Person.prototype.constructor 指向 Person。换句话说二者互相引用
    3. 调用构造函数回创建一个新实例,这个实例内部[[prototype]]指针回被赋值为构造函数的原型对象,浏览器会暴露proto属性,通过这个属性可以访问对象的原型。
    4. 正常的原型链都会止于object原型对象
    5. object的原型对象是null
  2. 原型层级

    1. hasOwnPrototype
  3. 原型和in操作符

    1. 可以单独使用in操作符和for-in
  4. 属性枚举顺序

    1. object.keys()和for-in 是无序
    2. getOwnPropertyNames是升序的,Object.getOwnPropertySymbols()和 Object.assign() 的枚举顺序是确定性的。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值