对象
对象基础
对象的定义
对象是一个包含相关数据和方法的集合(通常由一些变量和函数组成,我们称之为对象里面的属性和方法)。
对象有时被称之为关联数组(associative array)了——对象做了字符串到值的映射,而数组做的是数字到值的映射。
创建一个对象通常先定义初始化变量。
var person = {};
person // Object {}
点表示法
对象的名字表现为一个命名空间(namespace),它必须写在第一位-----当你想访问对象内部的属性或方法时,然后是一个点(.),紧接着是你想要访问的项目,标识可以是简单属性的名字(name),或者是数组属性的一个子元素,又或者是对象的调用方法。例如:
person.age
person.interests[1]
person.bar()
子命名空间
可以用一个对象来做另一个对象成员值。例如将name成员
name:['wh','xi'],
改成
name :{
first : 'wh',
last : 'xi'
},
这样,我们实际上创建了一个子命名空间,听起来有点复杂,但用起来很简单,你只需要链式的再使用一次点表示法,像这样:
person.name.first
person.name.last
注意:你需要改变你之前的代码,从
name[0]
name[1]
改成
name.first
name.last
否则,你的方法不再有效。
括号表示法
另外一种访问属性的方式是使用括号表示法(bracket notation),替代这样的代码
person.age
person.name.first
使用如下所示的代码:
person['age']
person['name']['first']
这看起来很像访问一个数组的元素,从根本上来说是一回事儿,你使用了关联了值的名字,而不是索引去选择元素。难怪对象有时被称之为关联数组(associative array)了——对象做了字符串到值的映射,而数组做的是数字到值的映射。
原型原型链
原型对象
在JavaScript 中,每当定义一个对象(函数) 时候,对象中都会包含一些预定义的属性。其中函数对象的一个属性就是原型对象 prototype 。注:普通对象没有prototype,但是有_ _ proto _ _ 属性 。
原型对象其实就是普通对象 (Function.prototype 除外,它是函数对象,但它很特殊,他没有prototype 属性(前面说道函数对象都有prototype 属性))。
原型对象是用来做什么的呢?
主要作用是用于继承。举个例子
var person = function(name){
this.name = name;
};
person.prototype.getName = function(){
return this.name;
}
var veb = new person('Veblen');
veb.getName(); // Veblen
从这个例子可以看出,通过给person.prototype设置了一个函数对象的属性,那有person实例
function Person() {
}
// 虽然写在注释里,但是你要注意:
// prototype是函数才会有的属性
Person.prototype.name = 'Kevin';
var person1 = new Person();
var person2 = new Person();
console.log(person1.name) // Kevin
console.log(person2.name) // Kevin
(例中:veb) 出来的普通对象就继承了这个属性。具体是怎么实现的继承,就要讲到下面的原型链了。
prototype
每个函数都有一个 prototype 属性,就是我们经常在各种例子中看到的那个 prototype ,比如:
那这个函数的 prototype 属性到底指向的是什么呢?是这个函数的原型吗?
其实,函数的 prototype 属性指向了一个对象,这个对象正是调用该构造函数而创建的实例的原型,也就是这个例子中的 person1 和 person2 的原型。
那什么是原型呢?你可以这样理解:每一个JavaScript对象(null除外)在创建的时候就会与之关联另一个对象,这个对象就是我们所说的原型,每一个对象都会从原型"继承"属性。
让我们用一张图表示构造函数和实例原型之间的关系:
构造函数和实例原型的关系图
在这张图中我们用 Object.prototype 表示实例原型。
原型链
JS 在创建对象(不论是普通对象还是函数对象) 的时候,都有一个叫做
_ _ proto _ _ 的内置属性,用于指向创建它的函数对象的原型对象 prototype 。
console.log(veb.__proto__ == person.prototype) //true
同样,person.prototype 对象也有__proto__ 属性,它指向创建它的函数对象(Object)的 prototype
console.log(person.prototypr.__proto__ Object.prototype) //true
继续,Object.prototype对象也有__proto__属性,但是它比较特殊,为null
console.log(Object.prototype.__proto__) //null
我们把这个有_ _ proto _ _ 串起来的直到Object.prototype. _ _proto _ _ 为null的链叫做原型链。
js new一个对象的过程
function mon(name) {
this.name = name
}
var son = new mon()
1、创建一个新对象:son
2、新对象会执行一个[[prototype]]连接
son.__proto__=mon.prototype
3、对象实例和对象的this会绑定起来
4、执行对象中的代码
this.name = name
5、如果函数没有返回值,就是返回新对象
什么是原型链
function supermarket() {
}
supermarket.prototype.product = "salks"
console.log(supermarket.prototype)
function shop() {}
shop.prototype = new supermarket()
console.log(shop.prototype)
var person = new shop()
console.log(person.product)
说明:我并没有在shop中定义product,按理说它应该为空,但是我让shop的原型对象指向supermarket的实例,它就会去supermarket中寻找有没有product属性。
作用:我们可以利用这特性实现类的继承