字面量
构建函数最简单的方法就是直接用字面量
let person = {
name:'王五',
say(){
console.log(this.name)
},
get age(){
return '未知'
},
set age(newValue){
alert('人无再少年')
}
}
工厂模式
要批量创建一类对象就不太方便了,于是有了函数工厂
function person( ){
let person = new Object()
person.name = "wangwu"
person.say = function(){
console.log(this.name)
}
Object.defineProperty(person,'age',{
get age(){
return '未知'
},
set age(newValue){
alert('人无再少年')
}
})
Object.defineProperties(person,{
sex:{
get(){
return "我不告诉你"
},
set(newValue){
alert('你居然想变性')
}
},
weight:{
enumerable:true,
writable:false,
configurable:true,
value:"长胖真难"
}
})
return person
}
构造函数
但是这种方式创建的对象没有标识,明明是一个厂家出的但是没办法辨别,
所以有了构造函数,构造函数首字母大写
function Person(){
this.name = "lisi"
this.say = function(){
console.log(this.name)
}
}
构造函数给定了this指向,而且不用手动return
也有了标识,
原型
但是即便是完全一样的属性方法,有多少实例就要初始化多少次,实际上完全可以共用,原型就是这样的
let Book = function(){
}
Book.prototype.material = 'animate'
这样所有的Book实例都有一个material属性,但这个属性并不是定义在实例上的,也就是不用每次初始化都定义一次
对象实例的原型对象 和构造函数的原型指向的是同一个对象,
原型对象的constructor就是构造函数,
console.log(book1.__proto__ === Book.prototype)
console.log(book1.__proto__.constructor === Book)
console.log(Book.prototype.isPrototypeOf(book1)) // 用 instanceof 似乎没有什么不同,不过这个更精确
console.log(Object.getPrototypeOf(book1) === book1.__proto__) //既然如此为何不直接用点语法