对象的创建
- 简短对象:一个键值对的集合
var obj={
name:"",
getName:function(){}
};
- 复杂对象(可重用的对象)
使用new
关键字,作用于函数,函数会自动创建一个新的空对象({}
),然后用函数中的各种声明填充这个新的对象,最后返回这个新的对象,在此过程中,使用了this关键字,会成为这个对象的公有属性,使用var关键字的因为作用域的关系会成为一个在外部不可访问的属性(私有属性)
function Ninjia(){
var name="";
this.getName=function(){return name};
}
var ninjia=new Ninjia();
- 有继承关系的对象:使用prototype属性
所有的函数都有一个prototyoe属性,这是一个指针,默认指向一个空对象 ,只有在函数充当构造器的时候才会有作用
当函数充当构造器时,使用它产生的实例会有一个constructor的引用,指向产生实例的构造器(也就是函数),构造器拥有一个prototype的属性。所以prototype,也就是原型不是一个对象本身的属性,但是如果一个属性在对象上找不到的话,Javascript会在它的原型上继续寻找,所以对一个对象的扩展属性可以挂载到对象的原型上去。
这样有一个问题,如果对象本身就有一个属性,而原型上也有同名的属性怎么办?
javascript默认的搜索属性的方式是从对象到原型,如果原型也有自己的原型的话,就接着找原型的原型,以此类推。因此,在对象和对象的原型上有同名属性的时候,对象本身的属性优先级最高,访问和操作时都是操作的对象本身的属性。
对象的原型上面除了可以挂载属性之外,还可以直接将对象的原型更改成另一个对象,在这个时候,JS风格的继承就出现了。
我们可以手动将一个构造器的prototype指向另一个对象,这样就实现了对象的继承
function Father(){}
function Child(){};
Child.prototype=new Father();