Javascript 为什么';本例中的t.\uuuu proto\uuuuu=.prototype?
我理解“Javascript 为什么';本例中的t.\uuuu proto\uuuuu=.prototype?,javascript,Javascript,我理解“\uuuuu proto\uuuuu是一个对象的内部属性,指向其原型”,因此在下面的示例中,我认为c2.prototype将等于c2.\uuuu proto\uuuu。为什么它们没有相同的值 <!DOCTYPE html> <html> <head> <script type="text/javascript"> window.onload = function() {
\uuuuu proto\uuuuu
是一个对象的内部属性,指向其原型”,因此在下面的示例中,我认为c2.prototype
将等于c2.\uuuu proto\uuuu
。为什么它们没有相同的值
<!DOCTYPE html>
<html>
<head>
<script type="text/javascript">
window.onload = function() {
var Circle = function(radius) {
this.radius = radius;
this.doubleRadius = function() {
return this.radius * 2;
}
}
var c1 = new Circle(4);
Circle.prototype.area = function() {
return Math.PI*this.radius*this.radius;
}
var c2 = new Circle(5);
console.log('--- first circle object, created before adding "area" method');
console.log(c1.radius);
console.log(c1.doubleRadius());
console.log(c1.area());
console.log('--- second circle object, created after adding "area" method');
console.log(c2.radius);
console.log(c2.doubleRadius());
console.log(c2.area());
console.log(c2.prototype); // undefined
console.log(c2.__proto__); // Object { area=function() }
}
</script>
</head>
<body>
</body>
</html>
window.onload=函数(){
变量圆=函数(半径){
这个半径=半径;
this.doubleRadius=函数(){
返回此参数。半径*2;
}
}
var c1=新的圆圈(4);
Circle.prototype.area=函数(){
返回Math.PI*this.radius*this.radius;
}
var c2=新圆圈(5);
log('---第一个圆形对象,在添加“area”方法之前创建);
控制台日志(c1.半径);
console.log(c1.doubleRadius());
console.log(c1.area());
log('---第二个圆形对象,在添加“area”方法后创建);
控制台日志(c2.半径);
console.log(c2.doubleRadius());
console.log(c2.area());
console.log(c2.prototype);//未定义
console.log(c2.\uuuuu proto\uuuuuu);//对象{area=function()}
}
试试下面的方法
console.log(c2.constructor.prototype);
console.log(c2.__proto__);
实际上,当c2是一个对象时,
.prototo\uuu
=.constructor.prototype
。obj.\uu prototo\uuu
是obj.constructor.prototype
的简短版本,而不是obj.prototype
:
console.log(c2.constructor.prototype === c2.__proto__); //true
console.log(c2.prototype === c2.__proto__); //false
简单的答案是
c2.constructor.prototype==c2.\uuuu proto\uuuu
构造函数具有
.prototype
属性。实例没有,但它们确实有。\uuuu proto\uuuu
和构造函数
属性这并不是一个很短的版本。您可以更改对象的单个实例的原型,而不影响其他实例。的确,两个版本都指向同一个对象(除非你修改了它)。@JuanMendes“更改单个实例的原型”是什么意思?请给我举个例子,其中c2.constructor.prototype!=c2.\uuuu proto\uuuuu
。我的评论是,除非你修改了它,否则我认为它听起来有点明显。在这里,我从同一个构造函数创建了两个实例,修改了其中一个的\uuuu proto\uuu
属性。对于已修改的一个,console.log(a.constructor.prototype==a.。\uuuuuproto\uuuuuu)代码>输出false@JuanMendes谢谢你抽出时间来做个例子。事实上,我认为,更改意味着某种c2.\uuu proto\uuuu.prop='blabla'
东西,但不改变整个原型。@enginer我明白你的意思。在任何情况下,我从未遇到过这样的情况(因为\uuuuu proto\uuuuu
不是跨浏览器的),或者我想这样做。如果这不是真的,请参阅我对工程师答案的评论。