标签:
js对象能够定义为:”无需属性的集合,其属性能够是基本值、对象和函数。每一个对象都是基于一个引用类型创建的。
js创建对象有下面两种方法:
var person = new Object();
var person ={};
function createPerson(name,age,job){ var p = new Object(); p.name=name; p.age=age; p.job=job; return p; } var p1=createPerson("jack",22,“front-end Engineer"); var p2=.....;
function Person(name,age,job){ this.name=name; this.age=age; this.job=job; this.sayName=function(){alert(this.name);}; } var p1= new Person("jack",22,"front-end Engineer"); var p2=...;
这里暂停一下,由于构造函数模式比較重要,这里解释一下:这里实际上是经历了下面4个步骤:
(1)创建一个对象;
(2)将构造函数作用域赋给这个对象(所以this将指向这个新创建的对象)
(3)运行里面的代码,为新对象加入属性;
(4)返回新对象;
上面创建的p1和p2都有一个constructor的属性,它指向Person。而且p1和p2即使Person的实例,同一时候也是Object的实例,由于全部对象都继承自Object。
缺陷:每一个方法都要在实例上又一次创建一遍,js中的函数是对象,因此能够将函数转移到构造函数的外部:
function Person(name,age,job){ this.name=name; this.age=age; this.job=job; this.sayName=sayName; } fucntion sayName(){ alert("this.name"); } var p1=.....; var p2=....;
我们创建的函数都有一个prototype属性,它是一个指向一个对象的指针。
6.抽象函数:
Object.extend=function(destination,source){ for(property in source){ destination[property]=source[property]; } return destination; } //定义一个抽象基类base,无构造函数 function base(){}; base.prototype={ initialize:function(){ this.oninit();//调用了一个虚方法 } } function SubClassA(){ //构造函数 } SubClassA.prototype=Object.extend({ propInSubClassA:"propInSubClassA", oninit:function(){ alert(this.propInSubClassA); } },base.prototype); function SubClassB(){ //构造函数 } SubClassB.prototype=Object.extend({ propInSubClassB:"propInSubClassB", oninit:function(){ alert(this.propInSubClassB); } },base.prototype); var objA=new SubClassA(); objA.initialize();//输出"propInSubClassA" var objB=new SubClassB(); objB.initialize();//输出"propInSubClassB"
标签:
原文地址:http://www.cnblogs.com/bhlsheji/p/4302579.html