为什么在这个例子中.__proto__ = .prototype

Why doesn't .__proto__ = .prototype in this example?

本文关键字:proto prototype 为什么      更新时间:2023-09-26

我知道" __proto__ 是一个对象的内部属性,指向它的原型"所以在下面的示例中,我认为c2.prototype等于 c2.__proto__ 。为什么它们没有相同的价值?

<!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>

简单的答案是c2.constructor.prototype == c2.__proto__

构造函数具有.prototype属性。实例没有,但它们具有.__proto__.constructor属性

obj.__proto__obj.constructor.prototype的简短版本,而不是obj.prototype

console.log(c2.constructor.prototype === c2.__proto__);   //true
console.log(c2.prototype === c2.__proto__);   //false

请尝试以下操作。

console.log(c2.constructor.prototype);
console.log(c2.__proto__);

实际上,当 c2 是一个对象时,.__proto__ == .constructor.prototype