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
不是跨浏览器的),或者我想这样做。如果这不是真的,请参阅我对工程师答案的评论。