Javascript和函数原型分配
Javascript and function prototype assignment
我一直认为函数的原型在所有对象之间共享,在某种意义上是通过引用共享的。如果你改变原型一个属性的值,所有共享那个原型的对象的值也会改变。因此,下面的例子似乎不是所有对象之间共享属性栏,而是复制属性栏。这样对吗?构造函数原型的属性是在创建时简单地复制到所有类对象中,还是通过链接共享?
function foo()
{
this.bar = 1;
}
function derived() { }
derived.prototype = new foo()
object1 = new derived()
object2 = new derived()
object1.bar = 2;
//but notice if I had said here derived.prototype.bar = 3, object1.bar would still equal 2 but object2.bar would equal 3
alert(object2.bar) // this prints 1;
当您分配object1.bar = 2
时,您正在object1
上创建一个自己的属性,该属性仅存在于该对象实例中,并且与它的原型无关。
object1
上的这个属性将遮蔽存在于derived.prototype
上的值,这意味着当您查找object1.bar
时,它将找到直接存在于该对象上的值。
另一方面,如果你查找object2.bar
,这个对象没有自己的bar
属性,所以属性查找将搜索这个对象从(derived.prototype
)继承的对象,它将找到值1
。
你的对象结构看起来像这样:
<>之前中的object1--------|酒吧:2 | ------------------------- | derived.prototype| ----------|------> | bar: 1 |——foo.prototypeobject2(没有自己的属性 )| ---------- | -------------------------- | -> |构造函数:foo || | ----------------- -------------------------- |v------------------|对象。原型机|------------------|v零之前其中--->
行表示表示继承的内部[[Prototype]]
链接
例如,您的代码:
function Animal() {
}
Animal.prototype.name="animal";
function Dog() {
}
Dog.prototype = new Animal
Dog.prototype.constructor=Dog;
Dog.prototype.name="dog";
object1 = new Animal();
object2 = new Dog();
结果你有两个对象实例,看起来像(你可以检查这个,例如在Chrome devtools或FF firebug或…):
object1:
__proto__: (is ref into an Animal.prototype object)
constructor: function Animal()
name: "animal"
__proto__: Object (is ref into an Object.prototype object)
object2:
__proto__: (is ref into an Dog.prototype object)
constructor: function Dog()
name: "dog"
__proto__: (is ref into an Animal.prototype object)
constructor: function Animal()
name: "animal"
__proto__: (is ref into an Object.prototype object)
当你运行下一个代码时(例如):
alert(object1.name); // displayed "animal"
alert(object2.name); // displayed "dog"
发生了什么事?1) Javascript在对象实例(object1
或object2
)中查找属性名。2)未找到时,查找对象实例proto属性(与类函数的prototype相同)。3)未发现时,在proto和next和next中查找proto,而未找到name
属性和其他proto找到。如果找到了搜索属性的结果,则返回value,如果没有找到,则返回undefined
。
如果执行下一段代码会发生什么:
object2.name = "doggy";
因此,对于object2:
object2:
name: "doggy"
__proto__: (is ref into an Dog.prototype object)
constructor: function Dog()
name: "dog"
__proto__: (is ref into an Animal.prototype object)
constructor: function Animal()
name: "animal"
__proto__: (is ref into an Object.prototype object)
属性直接赋值给实例对象,但原型对象保持不变。当你执行:
alert(object1.name); // displayed "animal"
alert(object2.name); // displayed "doggy"
当你需要创建|change shared属性时,你可以使用next算法中的一个:1)
Animal.prototype.secondName="aaa";
alert(object1.secondName); // displayed "aaa"
alert(object2.secondName); // displayed "aaa"
Animal.prototype.secondName="bbb";
alert(object1.secondName); // displayed "bbb"
alert(object2.secondName); // displayed "bbb"
// but
Animal.prototype.secondName="ccc";
object1.secondName="ddd";
alert(object1.secondName); // displayed "ccc"
alert(object2.secondName); // displayed "ddd"
2)在函数类的原型中创建类型为object
的属性,并为该对象的属性赋值。
Animal.prototype.propObject={thirdName:"zzz"};
alert(object1.propObject.thirdName); // displayed "zzz"
alert(object2.propObject.thirdName); // displayed "zzz"
Animal.prototype.propObject.thirdName="yyy";
alert(object1.propObject.thirdName); // displayed "yyy"
alert(object2.propObject.thirdName); // displayed "yyy"
object1.propObject.thirdName="xxx";
alert(object1.propObject.thirdName); // displayed "xxx"
alert(object2.propObject.thirdName); // displayed "xxx"
object2.propObject.thirdName="www";
alert(object1.propObject.thirdName); // displayed "www"
alert(object2.propObject.thirdName); // displayed "www"
- Javascript原型通用Enquries和通过数组索引分配Id
- 将函数分配为原型函数的属性
- JS继承和原型分配
- Javascript:分配给对象或数组原型会导致括号不起作用
- 在不为原型分配属性的情况下扩展Javascript对象
- 将方法分配给函数内部或外部原型之间的差异
- 为什么可以't我使用原型将函数分配给变量
- 在 Javascript 中创建子类时,为什么要分配原型字段
- 为什么可以't我给“t”分配一个新值;这个“;在原型函数中
- 可以't在分配原型后访问构造函数
- 在分配原型之前,属性值是如何可用的
- 使用decorator将属性分配给非原型
- 函数没有分配给另一个函数'Chrome中的原型
- 为什么子类型必须为其分配父类型's子类型之外的原型's函数
- 使用名称空间将原型对象分配给对象中的匿名函数,这是未定义的
- 在JavaScript中重新分配原型
- 在构造函数中初始化的JavaScriptPrototype属性不会重写已分配的新原型
- javascript原型方法分配VS下划线_.extend
- 重新分配内置类型的原型
- 为什么要分配字符串'原型'到一个变量,然后使用它来设置对象的原型