- 创建对象的几种方式
- Object() 构造函数创建 ```javascript var Person = new Object()
Person.name = ‘Tom’ Person.age = 18
- 对象字面量 {} 方式,适用于起始时,内部数据是确定的,缺点是创建多个对象进代码过于重复```javascriptvar 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)
- 构造函数 + 原型方式,与上一个方法不同的是将共同使用的方法放到原型上面,在构造函数中只初始化一般数据```javascriptfunction Person(name, age) {this.name = namethis.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() 方法调用父类型```javascriptfunction Person(name, age) {this.name = namethis.age = age}function Student (name, age, number) {Person.call(this, name, age)this.number = number}
- 组合继承:原型链 + 借用构造函数组合继承
利用原型链实现对父类型对象方法的继承
利用 call() 函数借用父类型构造函数初始化相同属性
function Person(name, age) {this.name = namethis.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 = StudentStudent.prototype.sayNumber = function() {console.log('Number: ' + this.number)}
