自制一个构造函数
function Person(name, age) {
name = name || '匿名'
age = age || 0
const obj = {
name: name,
age: age
}
return obj
}
这个构造函数等价于
function Person(name = '匿名', age = 0) {
return { name, age }
}
const f = Person('fang', 18)
console.log(f)
现在Person构造出来的对象都能sayHi
function Person(name = '匿名', age = 0) {
const sayHi = function () {
console.log(`你好,我是${name}`)
}
return { name, age, sayHi }
}
等价于
function Person(name = '匿名', age = 0) {
return {
name,
age,
sayHi() {
console.log(`你好,我是${name}`)
}
}
}
const f1 = Person( 'fang', 18)
f1.sayHi()
const f2 = Person( 'yuan', 20)
f2.sayHi()
现在想把f1的sayHi和f2的sayHi合二为一
const sayHi = function() {
console.log(`你好,我是${this.name}`)
}
function Person(name = '匿名',age = 0 ) {
return{name, age, sayHi}
}
除了sayHi,Person构造出来的对象还有run
const sayHi = function() {
console.log(`你好,我是${this.name}`)
}
const run = function() {
console.log(`${this.name}在跑步`)
}
function Person(name = '匿名',age = 0 ) {
return{name, age, sayHi, run}
}
现在让我们来减少变量名
const Person共有属性 = {
sayHi: function () {
console.log(`你好,我是${this.name}`)
},
run: function () {
console.log(`${this.name}在跑步`)
}
}
function Person(name = '匿名', age = 0) {
return { name, age, sayHi, run }
}
精简为一个变量名
Person.共有属性 = {
sayHi: function () {
console.log(`你好,我是${this.name}`)
},
run: function () {
console.log(`${this.name}在跑步`)
}
}
function Person(name = '匿名', age = 0) {
return {
name,
age,
sayHi: Person.共有属性.sayHi,
run: Person.共有属性.run
}
}
利用隐藏属性,把共有属性放进隐藏属性
function Person(name = '匿名', age = 0) {
const obj = Object.create(Person.共有属性)
//obj的隐藏属性为Person.共有属性
obj.name = name
obj.age = age
return obj
}
Person.共有属性 = {
sayHi: function () {
console.log(`你好,我是${this.name}`)
},
run: function () {
console.log(`${this.name}在跑步`)
}
}
运行一下
const f1 = Person('fang', 18)
f1.sayHi()
f1.run()
const f2 = Person('yuan', 20)
f2.sayHi()
f2.run()
打印一下console.log(f1.constructor) -> Object
Person.共有属性 = {
constructor: Person,
sayHi: function () {
console.log(`你好,我是${this.name}`)
},
run: function () {
console.log(`${this.name}在跑步`)
}
}
最终构造函数Person是这个样子
function Person(name = '匿名', age = 0) {
const obj = Object.create(Person.共有属性)
//obj的隐藏属性为Person.共有属性
obj.name = name
obj.age = age
return obj
}
Person.共有属性 = {
constructor: Person,
sayHi: function () {
console.log(`你好,我是${this.name}`)
},
run: function () {
console.log(`${this.name}在跑步`)
}
}
现在加上new
function Person(name = '匿名', age = 0) {
this.name = name
this.age = age
}
Person.prototype = {
constructor: Person,
sayHi() {
console.log(`你好,我是${this.name}`)
},
run() {
console.log(`${this.name}在跑步`)
}
}
const f1 = new Person('fang', 18)
f1.sayHi()
f1.run()
const f2 = new Person('yuan', 20)
f2.sayHi()
f2.run()
new的好处
- new帮你创建一个新对象
- new帮忙准备Person.共有属性
- new帮忙关联隐藏属性与共有属性
- new返回一个新对象
class写法
class Person {
constructor(name = '匿名', age = 0) {
this.name = name
this.age = age
}
sayHi() {
console.log(`你好,我是${this.name}`)
}
run() {
console.log(`${this.name}在跑步`)
}
}