JS支持自定义对象
对象直接量
我们可以通过属性名:值,来创建一个对象,如
var test={ a:1, b:2, c:function(){ alert(this.a+this.b) } } test.c();
test 就是一个对象,包含属性a和b,方法c,方法中要引用属性,需使用this
通过这种方式创建对象不能很好的进行代码复用,如我们要创建test2,test3,就需要复制一遍上述代码,我们可以通过构造函数模式创建对接
构造函数
所谓"构造函数",其实就是一个普通函数,但是内部使用了this变量。对构造函数使用new运算符,就能生成实例,并且this变量会绑定在实例对象上。
function Person(name,sex){ this.name=name; this.sex=sex; this.hello=function(){ alert("hello: "+this.name) } } var li=new Person("李德龙","男"), wang=new Person("王小二","男"); li.hello(); wang.hello(); alert(li.hello==wang.hello); ///false
每个实例都有一个constructor属性,指向他们的构造函数
alert(li.constructor==Person); //true
通过上述构造函数有一个问题,多个实例的hello方法都是一摸一样的,而每生成一个实例,就增加一个hello方法,占用内存,我们可以通过Prototype模式解决整个问题
Prototype模式
我们将上述构造函数进行如下改造
function Person(name,sex){ this.name=name; this.sex=sex; } Person.prototype.hello=function(){ alert("hello: "+this.name) } var li=new Person("李德龙","男"), wang=new Person("王小二","男"); li.hello(); alert(li.hello==wang.hello); //true
Javascript规定,每一个构造函数都有一个prototype属性,指向另一个对象。这个对象的所有属性和方法,都会被构造函数的实例继承。
这意味着,我们可以把那些不变的属性和方法,直接定义在prototype对象上。
Prototype模式的验证方法
isPrototypeOf()
该方法用来判断某个对象和实例的关系
function Cat(name,color){ this.name=name; this.color=color; } var cat1=new Cat(); console.log(Cat.prototype.isPrototypeOf(cat1)); //true
hasOwnProperty()
每个实例都有一个hasOwnProperty()方法,用来判断某一个属性到底是本地属性,还是继承自prototype对象的属性。
console.log(cat1.hasOwnProperty('name')) //true,本地属性为true
in运算符
用来判断某个属性是否属于某个对象,不管是不是本地属性
console.log('name' in cat1); //true
in运算符还可以用来遍历某个对象的所有属性。
for(var pros in cat1){ console.log(pros); //name color }