学习Javascript的原型,getprototypeof,和__proto__

学习Javascript的原型,getprototypeof,和__proto__
原型有更深的了解,getprototypeof和原_ _

原型,getpropertyof和原_ _三原型的访问方法。他们的命名是很相似的,所以它是非常容易搞混。

它们的用途如下:

C.prototype:一般用于建立一类原型继承对象。例如,c.prototype = xxx,使对象的原型对象,使用新的C()是XXX。当然,对obj.prototype的使用也可以获得对象的原型对象。
getpropertyof:Object.getPropertyOf(obj)是ES5标准方法得到的obj对象的原型对象。
_原_:obj。_原_用于非标准方法得到的obj对象的原型对象。
为了充分理解获取原型的各种方法,下面是一个示例:
功能用户(姓名、passwordhash){
this.name =名称;
this.passwordhash = passwordhash;
}
user.prototype.tostring =函数(){
返回{用户+ this.name +};
};
user.prototype.checkpassword =功能(密码){
返回哈希(密码)= this.passwordhash;
};
VaR U =新用户(sfalken
用户功能有一个默认的原型属性,它的值是一个空对象。在上面的例子中,两方法添加到原型对象,ToString和checkPassword,分别。当用户调用构造函数来获得一个新的对象,其原型对象被自动分配到user.prototype object.u.prototype = user.prototype返回真正的。

用户功能,关系user.prototype,你可以表示为对象如下:
上图中的箭头表示继承关系。当访问U对象的某些属性时,它首先会尝试读取U对象上的属性。如果U对象没有属性,它会找到它的原型对象。

例如,当调用u.checkpassword(),因为在它的原型checkPassword对象定义的,不可以在你找到的对象,它是在你找到原型,和搜索序列U—> u.prototype(用户。原型)。

如前所述,该getprototypeof方法是ES5标准方法获取一个对象的原型对象。因此:
Object.getPrototypeOf(U)= user.prototype; / /真的

在某些情况下,同时提供了一个非标准的_原_属性用于获取原型对象的一个对象。当环境不提供ES5的标准方法,该方法getprototypeof可以暂时作为替代。_原_支持代码的测试环境,可以使用以下:
u.__原__ = user.prototype; / /真的
所以在Javascript中,类的概念是由构造函数完成(用户)和一个原型对象(用户。原型),用于实例实例之间共享。承建商负责建设具体到每个对象的属性,如名称和密码属性在上述例子的原型。对象是负责存储所有对象的共同属性,如checkPassword和toString方法,上述的例子。如下图所示,
二,优先向Object.getPrototypeOf要利用的对象,而不是_原_

object.getprototypeof介绍ES5为对象的原型对象的标准API,但在许多执行环境,也能达到同样的目的提供了一个特殊的_原_性质。

因为不是所有的环境提供_原_属性,每个环境以不同的方式来实现,这样的结果可能并不相同,例如,对象有一个空的原型:
在某些环境中
无功空= object.create(空); / /对象没有原型
_proto _ / /假空;(在某些环境中)

在某些环境中
无功空= object.create(空); / /对象没有原型
_proto_空; / /真实(在某些环境中)

所以当object.getprototypeof方法在环境支持下,最好使用它。即使是不支持的,它可以实现一个:
如果(typeof object.getprototypeof =未定义){
object.getprototypeof =功能(obj){
var t =类型的对象;
如果(obj | |!(T!=对象t!{函数){
抛出TypeError(不是一个对象);
}
_proto_返回对象;
};
}
上面的代码将首先检查当前的环境,如果Object.getPrototypeOf已经支持,它将不会被重新定义。

三、不修改原_ _

与Object.getPrototypeOf相比,原_特殊_还体现在其修改一个对象的原型继承链的能力,因为它是一个属性,它也可以是除了它的执行设置

但不修改_原_。原因如下:

首先,最明显的原因是可移植性,因为不是所有的这种属性支持Javascript的执行环境,所以原_ _使用后,运行的代码不会在那些不支持原_ _环境。
其次,它是性能的考虑,目前的Javascript引擎的实现将使对象属性访问的优化很重要,因为这些操作是最常见的。当修改的对象_原_,相当于修改整个继承结构的对象,这导致许多优化不再可用。
最后,最重要的原因是需要保证程序的可靠性。因为改变_原_属性,对象的原型继承链可能会完全改变。时出现意外错误代码是依赖于程序中原有的继承链。一般来说,原型继承链需要保持稳定。
当你需要给一个新创建的对象的原型对象,您可以使用所提供的方法object.create ES5,ES5的实施环境,object.create方法的实施能给出一个不依赖于_原_。

四、解决_原_兼容性的问题,让构造函数不再依赖新的关键词

当使用函数作为构造函数时,需要确保通过新关键字调用函数。
功能的用户(姓名、passwordhash){
this.name =名称;
this.passwordhash = passwordhash;
}
如果调用上面的构造函数,则忘记使用新关键字,然后:
VaR U =用户(baravelli
未定义的
this.name; / / baravelli
this.passwordhash; / / d8b74df393528d51cd19980ae0aa028e
可以发现,你是不确定的,而this.name和this.passwordhash分配价值。但这是一个全局对象。

如果构造函数被声明为依赖于严格模式
功能的用户(姓名、passwordhash){
使用严格;
this.name =名称;
this.passwordhash = passwordhash;
}
VaR U =用户(baravelli
这是未定义的错误:
当你忘记使用新的关键字的列表的错误时引发的。名字叫名字。这是因为在严格的模式,这个默认的方向将被设置为未定义的而不是全局对象。

那么,在调用函数时,是否有一种方法可以确保该函数可以被视为构造函数,不管是否使用新关键字下面的代码是实现,使用instanceof操作:
功能的用户(姓名、passwordhash){
如果(!(这是用户)){
返回新用户(姓名、passwordhash);
}
this.name =名称;
this.passwordhash = passwordhash;
}

var x =用户(baravelli
var y =新用户(baravelli
X是用户; / /真的
Y是用户; / /真的

上面的if代码块用于处理不使用new调用的情况。当没有使用new时,此点不是用户的实例,当使用新关键字时,此点是用户类型的实例。

另一种方法,用于在ES5的环境更适合如下:
功能的用户(姓名、passwordhash){
VaR是用户:自这object.create(用户。原型);
self.name =名称;
self.passwordhash = passwordhash;
回归自我;
}
的object.create方法提供的ES5,可以接受一个对象作为新创建的对象的原型。所以在一个非ES5的环境,你需要实现一个object.create方法首先:
如果(typeof object.create =未定义){
object.create =功能(原型){
函数C(){ }
c.prototype =原型;
返回新的C();
};
}
事实上,这object.create方法也有一个版本接受第二参数,第二个参数代表一系列给新创建的对象的属性。

当上述功能并使用新的呼叫,它也能够获得新的对象返回正确。这是由于构造叠加模式(构造函数重写模式),该模式的含义是,返回值的表达式中使用新的关键字可以被显式返回。正如回归自我是用在上面的代码中,返回值是明确定义。

当然,在某些情况下,上述的工作是不必要的,但是,当一个函数需要被称为构造函数时,它必须被解释。使用文档是一种方法。命名和初始化的方式也是一种方法(基于Javascript语言的一些约定)。

以上是Javascript原型,__proto__ getprototypeof和深入研究,希望有助于大家的学习
免责声明:本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕。
相关文章
返回顶部