网站名称和备案名称不一样,邢台网站网页设计,c2c电子商务网站的功能,网络推广服务商产品介绍构造函数 通过 new 函数名 来实例化对象的函数叫构造函数。 任何的函数都可以作为构造函数存在。之所以有构造函数与普通函数之分#xff0c;主要从功能上进行区别的#xff0c;构造函数的主要 功能为 初始化对象#xff0c;特点是和new 一起使用。new就是在创建对象#x…构造函数 通过 new 函数名 来实例化对象的函数叫构造函数。 任何的函数都可以作为构造函数存在。之所以有构造函数与普通函数之分主要从功能上进行区别的构造函数的主要 功能为 初始化对象特点是和new 一起使用。new就是在创建对象从无到有构造函数就是在为初始化的对象添加属性和方法。构造函数定义时首字母大写规范。 function Person(name) {this.name name;
}let p1 new Person(张三); // 实例化console.log(p1); // Person {name: 张三}此时p1就是一个新对象。
1. new一个新对象的过程发生了什么
创建一个空对象obj {}空对象的_proto_指向了构造函数的prototype成员对象使用apply调用构造器函数属性和方法被添加到 this 引用的对象中如果构造函数中没有返回其它对象那么返回 this即创建的这个的新对象否则返回构造函数中返回的对象
对new理解new 申请内存, 创建对象,当调用new时后台会隐式执行new Object()创建对象。所以通过new创建的字符串、数字是引用类型而是非值类型。
2. 手写new函数
function _new(func, ...args) {// 1. 创建空对象let obj {};// 2. 空对象的_proto_指向了构造函数的prototype成员对象obj.__proto__ func.prototype; // 一二步合并就相当于 let obj Object.create(func.prototype)// 3. 使用apply调用构造器函数属性和方法被添加到 this 引用的对象中let result func.apply(obj, args);// 4. 确保 new 出来的是个对象return typeof result object ? result : obj;
}测试用例
function Person(name, age) {this.name name;this.age age;
}let obj _new(Person, xia, 20);console.log(obj); // Person {name: xia, age: 20}3. 构造函数上的方法
在构造函数上直接定义方法不共享
function Person() {this.say function () { // 直接定义方法console.log(hello);}
}let p1 new Person();
let p2 new Person();
p1.say(); // hello
p2.say(); // helloconsole.log(p1.say p2.say); // false很明显p1 和 p2 指向的不是一个地方。 所以 在构造函数上通过 this 来添加方法的方式来生成实例每次生成实例都是新开辟一个内存空间存方法。这样会导致内存的极大浪费从而影响性能。
通过原型添加方法共享
构造函数通过原型分配的函数是所有对象共享的。
function Person(name) {this.name name;
}
Person.prototype.say function () { // 通过原型添加方法console.log(hello this.name);
}let p1 new Person(张三);
let p2 new Person(李四);
p1.say(); // hello 张三
p2.say(); // hello 李四console.log(p1.say p2.say); // true所以我们经常 将公共属性定义到构造函数里将公共方法放到原型对象上 。 点击查看“构造函数的五种继承方式”