在Javascript中的原型(原型)定义的一种特定类型的访问的所有实例的属性和方法,许多情况下需要指定一个值,在样机的性能,如果错误的方法会导致一些意想不到的情况(对于像我这样的新手的正义斗争),下面通过一个简单的这部分知识总结测试。

基本类型定义如下:
复制代码代码如下所示:
函数(人){ }

的人。原型= {
构造函数:人,
姓名:人
年龄:100岁,
好友:{
getName:函数(){
返回this.name;
}
};

定义两个实例的实例并修改实例中的name属性(属性在原型中定义),测试代码如下所示
复制代码代码如下所示:
新的人();
新的人();

document.write(P1。名称+); / /人
document.write(P2。名称+); / /人

P1 =P1;
document.write(P1。名称+); / / P1
document.write(P2。名称+); / /人

(p1.hasownproperty document.write(名称)+); / /真正属于对象
(p2.hasownproperty document.write(名称)+); / /假属于原型

document.write(Object.keys(P1)+); / /名字
document.write(Object.keys(P2)+ ); / /空
document.write(object.getownpropertynames(人。原型)+ ); / /构造函数,名字,年龄,朋友,同
document.write(人。原型。名称+); / /人

P1的测试后。名称=中可以找到P1不修改名字的价值但在P1的实例添加一个名称属性重写的名称属性的原型,从随后的判断可以视为P1名称属性实例的属性,而不是原型的属性,在Object.keys(P1 P1)也可以在这个例子中看到有一名物业并不在P2,JS,所有的传输都是值传递。此值可以是指向引用类型的指针。因此,等号并不意味着修改引用对象,而是切换原始引用关系。接下来,我们将用代码来说明这个问题。
复制代码代码如下所示:
var obj =新的对象();
Obj。名称=目标;

功能changeobj(o){
o.name =改变;
o =新对象();
o.name =newobj ;
}
ChangeObj(obj);

document.write(对象的名字); / /改变

在changedobj方法,O =新的对象()不修改参数的值,但切断了原来的参考,因此不newobj而改变

接下来,在第一个示例中尝试修改原型中的朋友属性,这是一个引用类型。
复制代码代码如下所示:
p1.friends.push(C);
document.write(P1。朋友+); / / A,B,C
document.write(P2。朋友+); / / A,B,C

朋友
document.write(P1。朋友+); / / X,Y,Z
document.write(P2。朋友+); / / A,B,C

(p1.hasownproperty document.write(朋友)+); / /真正属于对象
(p2.hasownproperty document.write(朋友)+); / /假属于原型

document.write(Object.keys(P1)+); / /的名字,朋友
document.write(Object.keys(P2)+ ); / /空
document.write(object.getownpropertynames(人。原型)+ ); / /构造函数,名字,年龄,朋友,同
document.write(人。原型。朋友+); / / A,B,C

这个测试结果与第一次测试基本相同。当它被一个相等的符号修改时,它将切断原始引用并为实例创建一个新的属性,并在原型中覆盖相同的名称属性。

基于这两个测试结果,我们发现原型中的值类型属性在实例中不能直接修改。当然,这个值类型不应该在原型中定义。这里的代码实例只表明知识点是不实际的。