javascript - javascript中的原型(prototype)行为

标签 javascript prototype-programming function-prototypes prototype-oriented

我对 javascript 中的以下原型(prototype)行为感到困惑。

function A(){
};

A.prototype.toString = function(){
            console.log('first');
               }

var a = new A(), b;

A.prototype = {
    toString:function(){
        console.log('second');
    }
}

b = new A();

a.toString();
//outputs :  first

b.toString();
//outputs :  second

与打印“second”的b.toString 相比,为什么a.toString 仍然打印“frist”。 谁能解释一下我在这里缺少什么。

最佳答案

原型(prototype)链接与构造的构造函数无关 对象,它存储在对象本身上。

当您调用 new A() 时,会发生这种情况:

var a = {};
a.__proto__ = A.prototype;
A.call(a);

请注意,以上不是标准语法,但可以在 chrome 和 firefox 中使用。

因此,当您覆盖 A.prototype 时,a.__proto__ 仍然链接到旧的 A.prototype,正如您所期望的那样 代码:

var A = 10, a, b;

a = A;
A = 7; //a is still 10
b = A; 

我不建议重新分配原型(prototype),因为那样你需要重新建立构造函数属性并且需要额外的缩进级别。

如果你想减少输入,只需存储对原型(prototype)的引用:

function A() {

}
var fn = A.prototype;

fn.toString = function() {

};

fn.valueOf = function() {

};

fn.toJSON = function() {

};

关于javascript - javascript中的原型(prototype)行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17179603/

相关文章:

javascript - Bootstrap col 大小取决于 ng-repeat 项目

javascript - 响应式 Filemanager 9 在 TinyMCE 4 中打开空白对话框

javascript - 使用 'invert' 函数在 Javascript 中扩展 boolean 对象

javascript - 极简原型(prototype)(js框架)

c++ - 当您声明 "pointer type"形式(函数)参数 "like an const array"时,const 是什么?

c - C 中意外的函数原型(prototype)行为

javascript - 使用 php 对表行重新排序

javascript - 如何使用回调函数作为参数,其中有自己独立的参数?

Javascript原型(prototype)和修改原始对象

elf - 如何从ELF文件中提取函数原型(prototype)?