对象的创建方法
-
字面量创建对象
let obj = { name:'winnie', color:'pink', say(){ console.log('sayHi') } } console.log(obj.name); // winnie obj.say(); //sayHi
-
调用系统 构造函数 创建对象
let obj = new Object(); obj.name = "winnie"; obj.say = function () { console.log("我是系统 构造函数创建的 对象 中的 方法 哦"); }; console.log(obj.name); //winnie obj.say();//我是系统 构造函数创建的 对象 中的 方法 哦
法1、2(缺点)创建对象效率很低,创建多个对象时会产生大量重复的代码
3.工厂模式创建对象
function createPerson (name, age) {
return {
name: name,
age: age,
sayName: function () {
console.log(this.name)
}
}
}
//生成实例对象
let per1 = createPerson('winnie',18)
console.log(per1.name) // => winnie
法3:(优点)解决了重复实例化多个对象的问题
(缺点)得出的对象虽然有 不同的键值对,可 其创建的对象名全为Object ,不能辨识产生的对象
4、自定义构造函数创建对象
function Person (name, age) {
this.name = name
this.age = age
this.sayName = function () {
console.log(this.name)
}
}
var p1 = new Person('Jack', 18)
p1.sayName() // => Jack
var p2 = new Person('Lily', 17)
p2.sayName() // => Lily
而要创建 Person
实例,则必须使用 new
操作符。
以这种方式调用构造函数会经历以下 4 个步骤:
- 创建一个新对象
- 将构造函数的作用域赋给新对象(因此 this 就指向了这个新对象)
- 执行构造函数中的代码
- 返回新对象
构造函数需要配合new操作符使用才有意义,构造函数首字母一般为大写
法4:(优点)创建对象方便
(缺点)同一个方法在创建不同的对象时,都会产生新的存放地址,造成浪费内存
如图示意:
法4:内存浪费解决方法(提取同一个 say 方法)
// 提前将say方法声明好
function say() {
console.log(this.name);
}
function createStudent(name, age) {
this.name = name;
this.age = age;
this.say = say
}
const obj = new createStudent('jack', 18);
const obj1 = new createStudent("Lily", 17);
console.log(obj.say === obj1.say); // true