本文共 1852 字,大约阅读时间需要 6 分钟。
理解面向对象的基本模式
一般情况下 我们的创建对象的方式如下: var person = {}; person.name = "tugenhua"; person.age = 24; person.sayName = function(){alert(this.name);} person.sayName();//调用方法但是使用这个传统的模式 会有个明显的缺点 使用同一个接口创建很多对象 会产生很多重复的代码;所以我们就引来工厂模式来解决这个问题
工厂模式在很多动态语言中是创建类 但是在ECMAScript中是无法创建类的 所以程序员就开发出函数 比如工厂模式函数如下: function person(name,age,job){ var o = {};//创建一个对象 o.name = name; o.age = age; o.job = job; o.sayName = function(){alert(this.name);} return o; } var person1 = person("tu",24,"IT"); var person2 = person("genhua",24,"II"); person1.sayName();//tu person.sayName()//genhua; 这上面的函数是工厂模式的基本形式 虽然工厂模式解决了多个相似的对象问题 但是未解决的是对象识别的问题(怎样知道一个对象的类型),即变量person1和变量person2调用函数person时候 返回的都是对象o. 之后我们引入构造函数来解决多个对象的识别问题 下面是构造函数的基本形式。 function Person(name,age,job){ this.name = name; this.age = age; this.job = job; this.sayName = new function(){ alert(this.name); } } var person1 = new Person("tugenhua",24,"IT"), person2= new Person("tutu",24,"IT"); person1.sayName();//tugenhua person2.sayName();//tutu; 恩 上面的是构造函数模式 构造函数模式与工厂模式相比较 1 没有明显的创建对象 2 没有返回值 3 直接将属性和方法赋值给了this对象 优点是:创建自定义构造函数将来可以将它的实例标定为一种特定 的类型 这也是说明的了 构造函数模式胜过工厂模式 但是构造函数模式虽然很好 但是还是有缺点 每个方法都要在每个实例中创建一遍,上面的两个实例的方法并不是一样的 person1.sayName == person2.sayName;//返回是false;但是上面的代码我们可以改造下 因为我们想要两个实例的函数一样 那么我们可以把上面的sayName这个方法当作全局变量来申明,那么这两个就是引用的是同个函数了!虽然可以让不同的实例来调用同个函数 但是问题又来了 在全局作用域定于的函数实际上只能被某个对象调用。更让人无法接受的是 如果对象需要定于很多方法 那么就要定于多个全局函数 那么就缺乏封装性 这是个问题 所以我们下面可以引用javascript原型来解决上面的问题!原型就是可以让所有对象实例共享他们的属性和方法! 理解原型: 无论什么时候 只要创建了一个新函数 该函数就会产生一个原型属性对应 那么所有的原型prototype属性都会自动获得一个构造函数属性 当调用一个构造函数新实例后 该实例内部会有个指针指向该原型属性 我们要明白最重要的一点是 链接是存在于实例与构造函数原型属性之间 而并非与构造函数之间 该原型模式基本形式如下 function Person(){} Person.prototype = { name : "tugenhua", age : 24, job : "IT", sayName : function(){alert(this.name);} } var person1 = new Person(); var person2 = new Person();