电 话:0

手 机:0

联系人:刘先生

E_mail:2074917417@qq.com

地 址:成都市金牛区

您当前的位置是:主页 > 行业资讯 > news >

news

ECMAScript中构造函数模式的不足之处和解决方法

发布时间:2022/01/11 丨 文章来源:未知 丨 浏览次数:

ECMAScript中构造函数模式虽然好用,但也并非没有缺点。使用构造函数的主要问题,就是每个方法都要在每个实例上重新创建一遍。在前面的例子中,personl和person2都有一个名为sayName()的方法,但那两个方法不是同一个Function的实例。不要忘了——ECMAScript中的函数是对象,因此每定义一个函数,也就是实例化了一个对象。从逻辑角度讲,此时的构造函数也可以这样定义:

function Person(name,age,Job){

this.name=name;

this.age=age;

this.job=job;

this.name = new Function("alert(this.name)"); 南昌网络公司技术人提示:与声明函数在逻辑上是等到价的

}

从这个角度上来看构造函数,更容易明白每个Person实例都包含一个不同的Function实例(以显示name属性)的本质。如前所述,这两个函数是不相等的,下面的代码可以证明这一点:

alert(personl.sayName==Derson2.sayName); //false

然而,创建两个完成同样任务的Function实例的确没有必要;况且有this对象在,根本不用在执行代码前就把函数绑定到特定对象上面。因此,大可像下面这样,通过把函数定义转移到构造函数外部来解决这个问题:

function Person(name,age,job){ this.name = name; this.age = age; this.job = job; this.sayName = sayName; } function sayName(){ alert(this.name); } var personl=new Person("Nicholas",29,"Software Engineer")

var person2=new Person("Greg",27,"Doctor");

personl.sayName(); //"Nicholas"

person2.sayName(); //"Greg"

alert(personl instanceof Object);//true

alert(personl instanceof Person);//true

alert(person2 instanceof Obj ect);//true

alert(person2 instanceof Person);//true

alert(personl.constructor==Person); //true

alert(person2.constructor==Person); //true

alert(personl.sayName==person2.sayName); //true

在这个例子中,我们把sayName()函数的定义转移到了构造函数外部。而在构造函数内部,我们将sayName属性设置成等于全局的sayName函数。这样一来,由于sayName包含的是一个指向函数的指针,因此personl和person2对象就共享了在全局作用域中定义的同一个sayName()函数。这样做确实解决了两个函数做同一件事的问题,可是新问题又来了:在全局作用域中定义的函数实际上只能被某个对象调用,这让全局作用域有点名不副实。而更让人无法接受的是:如果对象需要定义很多方法,那么就要定义很多个全局函数,于是我们这个自定义的引用类型就丝毫没有封装性可言了,对于南昌建站公司技术人员来讲,这个理解有点难度,但结合实例,通过实例操作应该不成问题.

好在,这些问题可以通过使用原型模式来解决。

本文仅限内部技术人员学习交流,不得作于其他商业用途.文章出自:南昌网站建设公司-网络 http://www.huicuiwang.cn 如转载请注明出处!


PS:所有作品版权归原创作者所有,与本站立场无关,如不慎侵犯了你的权益,请联系我们告知,我们将做删除处理!


网站首页 | app开发| 小程序开发| SEM竞价托管| 行业资讯

扫码关注我们