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

浙公网安备 33010602011771号