摘要:工厂模式没有解决对象识别的问题即怎样知道一个对象的类型构造函数模式使用构造函数的主要问题,就是每个方法都要在每个实例上重新创建一遍。创建要返回的对象可以在这里定义私有变量和函数添加函数注意寄生构造函数中是返回对象注意寄生构造函数中是
1、工厂模式
没有解决对象识别的问题(即怎样知道一个对象的类型)
function createPerson(name, age, job) { var o = new Object(); o.name = name; o.age = age; o.job = job; o.sayName = function() { alert(this.name); }; return o; } var person1 = createPerson("Nicholas",29,"Software Engineer");2、构造函数模式
使用构造函数的主要问题,就是每个方法都要在每个实例上重新创建一遍。通过把函数定义转移到构造函数外部来解决这个问题
function Person(name, age, job) { this.name = name; this.age = age; this.job = job; this.sayName = function() { alert(this.name); }; } var person1 = new Person("Nicholas", 29, "Software Engineer"); //把函数定义转移到构造函数外部 function Person(name, age, job) { this.name = name; this.age = age; this.job = job; this.sayName = sayName; } function sayName(){ alert(this.name); } var person1 = new Person("Nicholas", 29, "Software Engineer");
如果对象需要定义很多方法,那么就要定义很多个全局函数,于是我们这个自定义的引用类型就丝毫没有封装性可言了。
3、原型模式原型对象的好处是可以让所有对象实例共享它所包含的属性和方法;
原型模式最大的问题是由其共享的本性导致的:对于那些包含基本值的属性可以通过在实例上添加一个同名属性,可以隐藏原型中的对应属性,但是对于包含引用类型值的属性来说,问题就很突出了。
function Person(){ } Person.prototype.name = "Nicholas"; Person.prototype.age = 29; Person.prototype.job = "Software Engineer"; Person.prototype.sayName = function(){ alert(this.name); }; var person1 = new Person(); person1.sayName();4、组合使用构造函数模式和原型模式
创建自定义类型的最常见方式就是组合使用构造函数模式与原型模式;
构造函数模式用于定义实例属性,而原型模式用于定义方法和共享的属性。
function Person(name, age, job){ this.name = name; this.age = age; this.job = job; this.friends = ["Shelby", "Court"]; } Person.prototype = { constructor : Person, sayName : function() { alert(this.name); } } var person1 = new Person("Nicholas",29,"Software Engineer");5、动态原型模式
通过检查某个应该存在的方法是否有效来决定是否需要初始化原型;
注意:使用动态原型模式时,不能使用对象字面量重写原型。如果在已经创建了实例的情况下重写原型,那么就会切断现有实例与新原型之间的联系;
function Person(name, age, job) { this.name = name; this.aghe = age; this.job = job; if(typeof this.sayName !="function") { Person.prototype.sayName = function(){ alert(this.name); }; } } var friend = new Person("Nicholas",29,"Software Engineer");6、寄生构造函数模式
封装创建对象的代码,然后再返回新创建的对象;
除了使用new操作符并把使用的包装函数叫做构造函数之外,这个模式和工厂模式其实是一模一样的
function Person (name, age, job) { var o = new Object(); o.name = name; o.age = age; o.job = job; o.sayName = function() { alert(this.name); }; return o; } var friend = new Person("Nicholas", 29, "Software Engineer");7、稳妥构造函数模式
稳妥构造函数遵循与寄生构造函数类似的模式,但有两点不同:
(1)新创建对象的实例方法不引用this;
(2)不使用new操作符调用构造函数。
function Person(name, age, job) { var o = new Object(); //创建要返回的对象 //可以在这里定义私有变量和函数 o.name = name; o.age = age; o.job= job; //添加函数 o.sayName = function() { alert(name); //注意寄生构造函数中是alert(this.name) }; //返回对象 return o; } //注意寄生构造函数中是var friend = newPerson("Nicholas", 29, "Software Engineer"); var friend = Person("Nicholas", 29, "Software Engineer"); friend.sayName(); //"Nicholas"
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/105958.html
摘要:使用最多的继承模式是组合继承,这种模式使用原型链继承共享的属性和方法,而借用构造函数继承实例属性。原型式继承,可以在不必预先定义构造函数的情况下实现继承,其本质是执行给定对象的浅复制。 1、原型链实现继承 function SuperType() { this.property = true; } SuperType.prototype.getSuperValue = func...
摘要:递归闭包模仿块级作用域私有变量小结在编程中,使用函数表达式可以无需对函数命名,从而实现动态编程。匿名函数也称为拉姆达函数。函数声明要求有名字,但函数表达式不需要。中的函数表达式和闭包都是极其有用的特性,利用它们可以实现很多功能。 1、递归 2、闭包 3、模仿块级作用域 4、私有变量 5、小结 在JavaScript编程中,使用函数表达式可以无需对函数命名,从而实现动态编程。匿名函数也称...
摘要:字符串大小写转换方法和则是针对特定地区的实现。可以基于指定的分隔符将一个字符串分割成多个子字符串,并将结果放在一个数组中将字符串转换为数组。分隔符可以是字符串,也可以是一个对象。 1、对象创建 String类型是字符串的对象包装类型,可以像下面这样使用String构造函数来创建。 var stringObject = new String(hello world); String对象...
摘要:除此之外,在超类型的原型中定义的方法,对子类型而言也是不可兼得,结果所有类型都只能用构造函数模式。创建对象增强对象指定对象继承属性这个例子的高效率体现在它只调用了一次构造函数。 1、原型链 原型链的基本思想是利用原型让一个引用类型继承另一个引用类型的属性和方法。构造函数、原型和实例的关系:每个构造函数都有一个原型对象;原型对象都包含着一个指向构造函数的指针;实例都包含一个指向原型对象的...
摘要:于是我就先把这本薄的经典书语言精粹修订版豆瓣读书本书简介总共章,除去附录,才页,读完并记录了一些笔记。读书笔记还可以分享给别人看。编程语言第版定义了的标准。程序检查时丢弃值为函数的属性。 之前看到这篇文章,前端网老姚浅谈:怎么学JavaScript?,说到怎么学习JavaScript,那就是看书、分析源码。10本书读2遍的好处,应该大于一本书读20遍。看书主动学习,看视频是被动学习。看...
阅读 1084·2021-11-23 09:51
阅读 1048·2021-10-18 13:31
阅读 2922·2021-09-22 16:06
阅读 4087·2021-09-10 11:19
阅读 2149·2019-08-29 17:04
阅读 372·2019-08-29 10:55
阅读 2407·2019-08-26 16:37
阅读 3339·2019-08-26 13:29