对象属性的方式有两种:
obj.xxxobj['xxx']那么,什么时候用到第二种([‘属性名’])的方式呢?
当属性名不是合法的标识名时
var obj = {} obj.content-type = 'application' // 报错 obj['content-type'] = 'application' // 正确当 属性名不确定时
var obj = {} // 想要将 param 的值 作为 key var param = 'age' obj.param = 42 // 变成了 {param: 42},不是想要的 obj[param] = 42 // {age: 42},正确在 JS中,对象的 key 值,必须都是字符串形式
如果 key 是一个 对象、数组,那么会调用 toString方法,再存储进对象中
var a = {} var obj1 = {n: 2} var obj2 = {m: 3} /* 先调用 Obj1.toString()方法,变成 [object Object] 所以 变成 a = { [object Object]: 4 } */ a[obj1] = 4 a[obj2] = 5 // 所以最后操作的,都是 key = [object Object] 的属性,a['[objetc Object]'] console.log(a[obj1])步骤:先创建空Objetc对象,再动态添加属性、方法
缺点:语句太多
var obj = new Object() obj.name = 'Tom' obj.age = 42下图是原本的原型链图:
那么,我们修改原型链,将Child的原型对象的 上级 改为 Person的原型对象就好了
所以:
// 父类: Person function Person(name, age) { this.name = name this.age = age } Person.prototype.showName = function() { console.log(this.name) } // 子类: Child function Child(name, age) { this.name = name this.age = age } // 1. 使得 子类的原型对象成为父类的实例对象 Child.prototype = new Person() // 2. 补充原型的构造函数 为子类本身 Child.prototype.constructor = Child var child = new Child('Jerry', 18) // Child --> Child.prototype --> Person.prototype(showName) --> Object.prototype child.showName() // Jerry用于继承属性
步骤:
使用父类的构造方法,作为继承属性方法改变父类构造方法this指向 // 父类: Person function Person(name, age) { this.name = name this.age = age } // 子类: Child function Child(name, age, sex) { // this.name = name // this.age = age // 1. 借用 Person 中的代码 // 2. 更改this指向,改为指向 Child的实例对象 Person.call(this, name, age) this.sex = sex } var child = new Child('Jeery', 18, 'man')