创建对象的几种方式
2019-06-18 本文已影响0人
Doki_455c
字面量创建对象
var obj = {
name: '王五', //属性
study: function () { //方法
return this.name+"学习中" //this指向的是方法调用者
}
}
obj.study() //方法调用
new Object() 创建对象
var obj1 = new Object()
obj1.name = '张三',
obj1 : function () {
return "学习中"
}
//缺点:创建多个同类对象时,代码会重复
工厂模式
function info (name,age) {
var obj = new Object()
this.name = name
this.age = age
return obj
}
var obj1 = info('李四',20) //函数调用
var obj2 = info('王五',22)
console.log(obj1.name, obj1.age)
console.log(obj2.name, obj2.age) //通过传递参数输出不同的值,解决了多个同类对象创建时代码重复的问题
缺点:1、一般对象都是通过new关键字创建,工厂模式只是通过函数调用的方式
2、使用 instanceof不能确定某个对象属于哪一个类
console.log(obj1 instanceof Object) //true
console.log(obj2 instanceof Object) //true
构造函数
//写在构造函数内部的属性 叫做实例属性 方法叫做 实例方法
function Info (name) { //大驼峰命名
this.name = name // 构造函数内的this指向通过构造函数new出来的对象
this.sleep = function () {
return this.name + '睡觉'
}
}
//第一个对象
var obj1 = new Info('我是第一个' )
//第二个对象
var obj2 = new Info('我是第二个')
//优点 : 对象创建方式规范,是通过new关键字创建的能确定某个对象属于哪一个构造函数(类)
function Info1(name) {
this.name = name
}
function Info2(name) {
this.name = name
}
var a1 = new Info1('第一个')
var a2 = new Info2('第二个')
console.log( a1 instanceof Info1) //返回true
console.log( a1 instanceof Info1) //返回false
//缺点 : 多个同类对象被创建时,相同的方法会被重复创建, 占用内存空间不共享
原型
//将属性和方法写在构造函数的外面
function Info () {
}
Info.prototype.name = '我是原型属性' //原型属性
Info.prototype.sleep = function () { //原型方法
return '在睡觉'
}
var obj1 = new Info()
console.log(obj1.name, obj1.sleep()) //输出'我是原型属性',我是原型方法
//优点 : 多个同类对象的相同方法是共享的 不会被重建
//缺点 : 所有对象的属性名都相同
混合
/* 将属性写成实例属性
将方法写成原型方法
解决了上面创建对象时遇到的所有的缺点 */
function Info(name) {
this.name = name //实例属性
}
Info.prototype.sleep = function () { //原型方法
return this.name + '在睡觉' //this的指向方法的调用者
}
var a1 = new Info('张三')
var a2 = new Info('李四')
console.log(a1.sleep()) //张三在睡觉
console.log(a2.sleep()) //李四在睡觉