js高级-创建一个对象的过程

  创建对象方法有两种,对象字面量/构造函数

(1)对象字面量

 它适合少量简单的对象创建

var obj = {
    a:10,
    b:'符',
    say(){
        //函数体
    }
}
//但是如果我们需要创建大量具有相同类型属性和方法(但值不同)的对象时,对象字面量就不适合了
//而且它也没有继承这类高级特性
//比如你需要创建统计公司1w名员工信息,总不可能一个一个去写对象字面量吧

对象字面量在创建大量同类型对象上的不足,构造函数解决了这个问题

(2)构造函数

构造函数通过new操作符调用构造函数,创建对应类型对象

 构造函数的定义

function Fn(){
    this.p = "创建了一个p属性";
    this.alterP = function(){
        console.log(this.p); //注意一定要this,执行调用它的对象,才能用作用域链找到p
    }
}

var o1 = new Fn();

在new调用构造函数时,发生的过程实际上为

// 创造一个空对象字面量
var obj = {};
// 给空对象添加__proto__属性,并将构造函数的原型对象引用地址赋值给它
obj.__proto__ = Fn.prototype;
// 将构造函数的作用域赋值个新对象,Fn函数中的this在call()函数操作下指向新对象obj,然后再调用Fn函数
于是给obj对象赋值了一个成员变量p和成员方法alterP
Fn.call(obj);
//最后将这个obj对象作为new操作Fn返回的结果赋值给a变量
return obj;
var a = obj

 

 

(3)constructor属性

修改对象原型上的constructor属性指向另一个构造函数,再调用原构造函数也不会发生变化,,起初始化对象作用的只能是构造函数本身

function C3(a, b){  
    this.p = a + b;  
    this.alertP = function(){  
        alert(this.p);  
    }  
}  
//我们定义一个函数来覆盖C3原型中的constructor,试图改变属性p的值  
function fake(){  
    this.p = 100;  
}  
C3.prototype.constructor = fake; //覆盖C3原型中的constructor  
var c3 = new C3(2,3);  
c3.alertP();//结果仍然为5  
posted @ 2021-12-31 17:27  嗜血汽车人  阅读(131)  评论(0)    收藏  举报