Javascript对象方法原型

Javascript object methods prototype

本文关键字:原型 方法 对象 Javascript      更新时间:2023-09-26

下面的区别是什么。哪种方式最好?

    var obj;
        obj = function () {
        }
        obj.prototype = {
         getName: function () {
         console.log("my name");
        }
     }

而这个

 var obj;
    obj = function () {
    }
    obj.getName.prototype = {
    console.log("my name");
    }

两者是一样的吗?

它们是不一样的,有效的方法是第一种方法。

也许你想问的是这些之间的区别:

function() Obj {}
Obj.prototype.getName = function() {
       console.log("my name");
};
var obj = new Obj;

与这个

function() Obj {
  this.getName = function() {
     console.log("my name");
  };
}
var obj = new Obj;

答案是两者都有效,第一个将函数添加到原型链,第二个添加到函数的实例。

让我们从第二个开始,更简单。运行代码后,obj将函数名称 getName 附加到自身。 obj.getName()将在 obj 上调用该方法。

而在第一个中,当你调用obj.getName()时,js 编译器将查看方法getNameobj,并且不会在那里找到它,因此它会尝试在链上查找它。js 中的所有对象都具有__proto__属性。另一个对象所在的位置。当您使用关键字创建对象new函数时,结果对象的__proto__设置为功能的原型。

像这样委派函数的优点是,假设你用这个函数创建了 30 个对象,那么也不会有 30 个 getName 方法。相反,所有对象仍将引用具有getName方法的原型对象。所以会有 30 个参考文献。

与第一个。

您正在用新对象覆盖完整的原型对象。因此,由于此分配,现有方法和属性将被删除。

与第二个

您正在分配新方法,而不是删除现有方法和属性。

编辑:

第二个应该是这样的

obj.prototype.getName = function(){
}
不,

它们不一样。

您发布的代码不是有效的 JavaScript。并引发语法错误。我只能假设您问以下哪一种是将属性断言到对象原型的"更好"方法:

var foo = {}
foo.prototype = {
   getName: function(){}
}

与:

var foo = {}
foo.prototype = {}
foo.prototype.getName = function(){}

第一种方法更好,因为您不会将新对象重新构造到原型 - 它会删除可能存在的所有属性。所以第一个被认为更好。