理解JavaScript中的原型概念

理解JavaScript中的原型概念,javascript,Javascript,我试图理解JavaScript中的原型 下面提到的示例1和示例2都给出了相同的输出 示例1[显示“f1 l1”] function parent(fname, lname) { this.firstName = fname; this.lastName = lname; this.fun1 = function () { return this.firstName + " " + this.lastName;

我试图理解JavaScript中的原型

下面提到的示例1和示例2都给出了相同的输出

示例1[显示“f1 l1”]

function parent(fname, lname) {
        this.firstName = fname;
        this.lastName = lname;
        this.fun1 = function () {
            return this.firstName + " " + this.lastName;
        };
    };

function child() {};
child.prototype = new parent('f1', 'l1');

var objChild = new child();
alert(objChild.fun1()); // alert displays 'f1 l1'
function parent(fname, lname) {
        this.firstName = fname;
        this.lastName = lname;           
    };

parent.prototype.fun1 = function () {
        return this.firstName + " " + this.lastName;
    }; 


function child() {};
child.prototype = new parent('f1', 'l1');

var objChild = new child();
alert(objChild.fun1()); // alert displays 'f1 l1'
示例2[还显示“f1 l1”]

function parent(fname, lname) {
        this.firstName = fname;
        this.lastName = lname;
        this.fun1 = function () {
            return this.firstName + " " + this.lastName;
        };
    };

function child() {};
child.prototype = new parent('f1', 'l1');

var objChild = new child();
alert(objChild.fun1()); // alert displays 'f1 l1'
function parent(fname, lname) {
        this.firstName = fname;
        this.lastName = lname;           
    };

parent.prototype.fun1 = function () {
        return this.firstName + " " + this.lastName;
    }; 


function child() {};
child.prototype = new parent('f1', 'l1');

var objChild = new child();
alert(objChild.fun1()); // alert displays 'f1 l1'
示例1和示例2之间的唯一区别是fun1函数的定义方式。 我的问题是,当定义fun1的任何一种方法给出相同的输出时,两者之间的区别是什么。我知道我对原型的理解不清楚


请澄清

您的第一个示例将fun1放在每个父实例上。第二个将其放在父原型上

在第一个示例中调用objChild.fun1时,JavaScript运行时将在子原型对象上找到该函数。在第二个示例中,它不会在那里找到它,但它会在继续检查父原型对象时找到它


顺便说一句,这不是建立继承链的最佳实践方式;这种方法无法解决一些令人困惑的细节。相对较新的Object.create函数是一个更好的选择,您可以找到有关它的信息,以及适用于旧浏览器的多边形填充。如果不清楚,我的意思是将child.protype设置为新实例化的父对象。

如果希望对所有对象使用相同的方法fun1,则首选第二种方法。相反,第一种方法允许您针对不同的对象使用此方法的不同实现。

@didierc原型的工作方式与模板不同。prototype对象始终与实例分开。@实际上,这是一个错误的类比。这可能是OP感到困惑的地方,所以我的评论实际上没有帮助。谢谢你的澄清!以下答案非常详细地解释了什么是原型、如何使用原型以及如何将原型用于继承: