关于动态原型

而是作者尼古Russ C. 扎卡s在【动态原型】方式创设对象的时候未有查究或许会设有的主题材料和平化解决方案。而单独在接二连三的时候对【动态原型】的瓶颈作了印证。即在作子类承袭的时候,不能够通过动态原型的法子来促成。
  原作大约如下:
后续机制不可能接纳动态化的来由是:prototype对象的独一性。实例代码:

复制代码 代码如下:

function A (i) {
this.a = i;
if (typeof A._init == 'undefined') {
A.prototype.func = function () {
return 0;
}
A._init = 1;
}
}
function subA (j) {
A.call(this, 1);
this.j = j;
if (typeof subA._init == 'undefined') {
subA.prototype = new A();
subA.prototype.func_sub = function () {
return ++j;
}
subA._init = 1;
}
}
var sub_a = new subA(1);
alert(sub_a.func_sub()); //error: sub_a.func_sub is not a function

Nicolas解释说在代码运行前,对象已被实例,并与prototype联系,在现阶段对prototype对象替换不会对它产生其余影响,即眼下的替换是拜访不到的,独有今后目的的实例才会展现出这种变动。于是第二个实例对象就能不得法。但第二个及随后的子类实例都没难点。
缓和情势就是在构造函数外赋予新的prototype对象:

复制代码 代码如下:

function A (i) {
this.a = i;
if (typeof A._init == 'undefined') {
A.prototype.func = function () {
return 0;
}
A._init = 1;
}
}
function subA (j) {
A.call(this, 1);
this.j = j;
if (typeof subA._init == 'undefined') {
subA.prototype.func_sub = function () {
return ++j;
}
subA._init = 1;
}
}
subA.prototype = new A();
var sub_a = new subA(1);
alert(sub_a.func_sub()); //2

惋惜那违背了大家怎么选用动态原型的最初的心意。
使用动态原型的初衷本来正是要让构造函数能“统一江山”,在视觉上令人以为原型方法是类组织的一片段。
  以上是《JavaScript高档程序设计》中对动态原型承袭小节的大要内容。
<! -- ========== 分割线 ============ -->
  但是Nicolas在原先的章节讲对象协会的【动态原型】情势中,仿佛忘了提那一个同样的主题素材。大家看看上文中最终二个事例:

复制代码 代码如下:

var Obj = function (name) {
this.name = name;
this.flag = new Array('A', 'B');
if (typeof Obj._init == 'undefined') {
Obj.prototype = {
showName : function () {
alert(this.name);
}
};
Obj._init = true;
}
}
var obj1 = new Obj('aa');
var obj2 = new Obj('bb');
obj1.showName(); //error: is not a function
obj2.showName(); // bb;

正确,那个主题素材其实和子类承继中冒出的标题大同小异,prototype在现阶段的轮换是不会对该对象有别的影响的,唯有在今后的实例中凸现。假若依据Nicolas管理动态原型承袭的主意中说的均等,那就意味着只好在构造函数外边重新赋予prototype对象。那么那不就成了【构造函数/原型混合】格局了呢?所谓的【动态原型】格局也就空中楼阁了...

  其实我们能够思索,为何在【构造函数/原型混合】这种已经主导未有副功能的营造对象格局背后还要在写一节【动态原型】情势。小编的意图无非正是想让构造函数在视觉上尤为统一么。其实只有要视觉上的统一能够不用动态原型的。

复制代码 代码如下:

var Obj = function () {
function __initialize (name) {
this.name = name;
this.flag = new Array('A', 'B');
}
__initialize.prototype = {
showName : function () {
alert(this.name);
},
showFlag : function () {
alert(this.flag);
}
}
return __initialize;
}();
var obj1 = new Obj('aa');
var obj2 = new Obj('bb');
obj1.showName(); // aa
obj2.showName(); // bb

事实上上边的主意就可以算是视觉的集合了,Obj的构造函数内经过__initialize来开端化属性,通过__initialize.prototype原型起先化方法。只可是稍微有一些“小作弊”的认为,__initialize代理了Obj的开首化...
  上边是源于tangoboy的“构造类”的包裹,其实思路和方面基本一致,独一区别的是她把质量也用原型格局创设了,同期把伊始化属性和方式都扔到了构造函数参数对象里。方便自定义:

复制代码 代码如下:

/* == form tangoboy == */
window['$Class'] = {
//创建八个类 混合构造函数/原型形式
create: function(config) {
var obj = function(){},config = config||{};
//过滤构造方法和原型方法
obj = obj.prototype.constructor = config["__"]||obj;
delete config["__"];
obj.prototype = config;
return obj;
}
}
/* -- eg -- */
var man = $Class.create({
__ : function (name) {
this.name = name;
},
sex : 'male',
showName : function () {
alert(this.name);
}
});
var me = new man('ru');
me.showName(); //ru

实际只要硬要追求视觉的联结也足以不用动态原型的格局。谈到底看看上边的思绪,已经回溯到了我们最常用的“类协会”格局:

复制代码 代码如下:

var Class = {
create : function () {
return function () {
this.initialize.apply(this, arguments);
}
}
}

深信下边这段代码大家大概都不会不熟悉,假若细究下去,会发觉其实和方面包车型地铁代码都同样,用initialize函数作了初阶化的代办,进而变成了视觉的联结。

本文由华夏彩票发布于关于计算机,转载请注明出处:关于动态原型

您可能还会对下面的文章感兴趣: