- 创建对象的几种方式
- Object() 构造函数创建 ```javascript var Person = new Object()
Person.name = ‘Tom’ Person.age = 18
- 对象字面量 {} 方式,适用于起始时,内部数据是确定的,缺点是创建多个对象进代码过于重复
```javascript
var Person = {
name: 'Tom',
age: 18
}
工厂模式,通过工厂函数动态创建并返回,适用于创建多个同类型的对象;缺点是对象没有具体的类型,都是 Object 类型
function createPerson(name, age) {
var obj = {
name: name,
age: age
}
return obj
}
自定义构造函数,通过 new 关键字创建对象,适用于创建多个类型明确的对象;缺点是每个对象都有相同的数据,浪费内存空间 ```javascript function Person(name, age) { this.name = name this.age = age }
var p1 = new Person(‘Tom’, 18)
- 构造函数 + 原型方式,与上一个方法不同的是将共同使用的方法放到原型上面,在构造函数中只初始化一般数据
```javascript
function Person(name, age) {
this.name = name
this.age = age
}
Person.prototype.say = function() {
console.log(this.name + ' say hello')
}
var p1 = new Person('Tom', 18)
p1.say()
var p2 = new Person('andy', 20)
p2.say()
- 继承模式
- 原型链继承:将子类型的原型等于父类型的实例,这样做会改变实例对象的构造器指向,会指向父对象 ```javascript function Supper() {}
function Sub() {}
Sub.prototype = new Supper() // 重新指定构造器 Sub.prototype.constructor = Sub
- 借用构造函数继承(此方式并不是真的继承),通过在子类型中使用 call() 方法调用父类型
```javascript
function Person(name, age) {
this.name = name
this.age = age
}
function Student (name, age, number) {
Person.call(this, name, age)
this.number = number
}
- 组合继承:原型链 + 借用构造函数组合继承
利用原型链实现对父类型对象方法的继承
利用 call() 函数借用父类型构造函数初始化相同属性
function Person(name, age) {
this.name = name
this.age = age
}
Person.prototype.sayName = function() {
console.log('My name is ' + this.name)
}
function Student(name, age, number) {
Person.call(this, name, age)
this.number = number
}
Student.prototype = new Person()
Student.prototype.constructor = Student
Student.prototype.sayNumber = function() {
console.log('Number: ' + this.number)
}