gpt4 book ai didi

javascript - 在 javascript 中的对象扩充期间什么时候应该使用 "prototype"?

转载 作者:数据小太阳 更新时间:2023-10-29 05:59:36 25 4
gpt4 key购买 nike

我对 javascript 中的“原型(prototype)”概念感到困惑。

当我定义一个对象时,以下两种方法似乎都有效:

myObject = {};
myObject.prototype.method1 = function() { ... };
myObject.prototype.method2 = function() { ... };
myObject.prototype.method3 = function() { ... };

和...

myObject = {};
myObject.method1 = function() { ... };
myObject.method2 = function() { ... };
myObject.method3 = function() { ... };

任何人都可以阐明这一点吗?这两种创建对象的方式到底有什么区别,为什么我会选择其中一种? (我有一种直觉,这很重要......)

谢谢!

最佳答案

您应该只在 Constructor Functions 上使用 prototype 属性,不在对象实例中,例如:

function Test () {}
Test.prototype.method1 = function () {/*...*/};

var obj = new Test();

构造函数的 prototype 属性由 new 运算符在创建我们的新对象实例时使用。

所有原生对象都有一个隐藏的链接,它构建了原型(prototype)链。

对象之间的这种隐藏链接是[[Prototype]] 内部属性,new 运算符是唯一可以设置它的。

在上面的示例中,obj 在内部与其构造函数原型(prototype)关联,method1 可从 obj 访问,但它不t 物理上存在于该对象上,该方法存在于 Test.prototype 对象上,并通过原型(prototype)链检索,例如:

typeof obj.method1; // "function"
obj.hasOwnProperty('method1'); // false
obj.method1 === Test.prototype.method1; // true

在对象实例上,分配一个 prototype 属性是没有意义的,它会像任何其他属性名称一样被采用:

var myObject = {};
myObject.prototype = "foo";
myObject.bar = "bar";

// myObject is simply {"prototype":"foo","bar":"bar"}

关于javascript - 在 javascript 中的对象扩充期间什么时候应该使用 "prototype"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2271166/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com