Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
您应该在什么时候使用;原型;在javascript中进行对象扩充时?_Javascript_Oop_Prototype - Fatal编程技术网

您应该在什么时候使用;原型;在javascript中进行对象扩充时?

您应该在什么时候使用;原型;在javascript中进行对象扩充时?,javascript,oop,prototype,Javascript,Oop,Prototype,我对javascript中的“原型”概念感到困惑 当我定义一个对象时,以下两项似乎都起作用: myObject = {}; myObject.prototype.method1 = function() { ... }; myObject.prototype.method2 = function() { ... }; myObject.prototype.method3 = function() { ... }; 而且 myObject = {}; myObject.method1 = fun

我对javascript中的“原型”概念感到困惑

当我定义一个对象时,以下两项似乎都起作用:

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

myObject = {};
myObject.method1 = function() { ... };
myObject.method2 = function() { ... };
myObject.method3 = function() { ... };
有人能解释一下吗?这两种创建对象的方法到底有什么区别?为什么我会选择其中一种而不是另一种?(我内心有一种感觉,这很重要……)


谢谢

您应该仅在上使用
prototype
属性,而不是在对象实例中使用,例如:

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

var obj = new Test();
构造函数函数的
prototype
属性由
new
操作符在创建新对象实例时使用

所有本机对象都有一个隐藏链接,用于构建原型链

对象之间的这个隐藏链接是
[[Prototype]]
内部属性,而
新的
操作符是唯一可以设置它的操作符

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

在对象实例上,指定
原型
属性毫无意义,它将与任何其他属性名称一样:

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

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

第二种方法仅向该对象添加方法。第一种方法使它可用于使用此“类型”创建的其他对象,这些对象使用
new

将多次添加内部添加的方法到构造函数内的每个实例,方法是:this.fn=function(){…};这对于拥有由实例方法访问的私有实例变量非常有用。
var myObject = {};
myObject.prototype = "foo";
myObject.bar = "bar";

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