对象创建模式
- 方式一: Object构造函数
- 适用场景: 起始时不确定对象内部数据
var person = new Object()
person.name = '张三'
delete person.name
- 方式二: 对象字面量
- 适用场景: 起始时对象内部数据是确定的
var person = {
name:'张三'
}
console.log(person.name)
- 方式三: 工厂模式
- 适用场景: 需要创建多个对象
function personFactory() {
var p = new Object()
p.name="张三"
return p
}
var person = personFactory()
console.log(person.name);
- 方式四: 构造函数
- 适用场景: 需要创建多个类型确定的对象
function Person(name) {
this.name = name
this.setName = function (name) {
this.name = name
}
}
var person = new Person('张三')
console.log(person.name)
person.setName('Lisi')
console.log(person.name)
- 方式五: 构造函数+原型的组合模式
- 适用场景: 需要创建多个类型确定的对象
- 注意:方法放在原型中,可以防止构造函数每次创建对象都会新建方法,有效节省内存
function Person(name) {
this.name = name
}
Person.prototype.setName = function (name) {
this.name = name;
}
var person = new Person('张三')
console.log(person.name)
person.setName('Lisi')
console.log(person.name)
继承
方式1: 原型链继承
直接上图
理解:
子类的构造函数的原型对象指向了父类的构造函数的实例对象,这个实例对象中存在着sup自身定义的属性以及他的原型(指向父类构造函数的prototype(里面有父类定义的方法))。
但是注意一个现象,如果这样更改的话subObj的constructor为sup构造函数,所以要更新改动一下sub的的constructor。
方式2: 借用构造函数继承
function Sup(name,age) {
this.name = name
this.age = age
}
function Sub(name,age,hobby) {
Sup.call(this,name,age)
//相当于this.Sup(name,age)
//这里的this为将来新创建的对象,
//因为此时Sup是作为this的方法使用的,
//那么this调用后,原来Sub里面的this也就是将来新创建的对象了
this.hobby = hobby
}
var sub = new Sub('zhangsan',15,'书法')
console.log(sub.name,sub.hobby)
方式3: 原型链+借用构造函数的组合继承
function Sup(name,age) {
this.name = name
this.age = age
}
Sup.prototype.setName = function (name) {
this.name = name
}
function Sub(name,age,hobby) {
Sup.call(this,name,age)
this.hobby = hobby
}
Sub.prototype = new Sup()
Sub.prototype.constructor = Sub
var sub = new Sub('zhangsan',15,'书法')
console.log(sub.name,sub.hobby)
sub.setName('lisi')
console.log(sub.name)