什么';在javascript中向对象添加新方法有什么区别?

什么';在javascript中向对象添加新方法有什么区别?,javascript,Javascript,有两种方法可以将该方法添加到javascript中的对象, 下面的方法有什么不同 1. var o=newobject(); o、 方法=函数(){} 2. var o=newobject(); o、 prototype.method=function(){} 原型是全球性的。它可以被所有对象使用。 您甚至可以覆盖或删除标准方法。如果要为对象定义一个新方法,那么它是本地的,并且仅用于对象的此实例 另一方面,如果在prototype范围内定义它,那么它的全局和方法是为所有实例定义的。我在这里写的

有两种方法可以将该方法添加到javascript中的对象, 下面的方法有什么不同

1.
var o=newobject();
o、 方法=函数(){}

2.
var o=newobject();
o、 prototype.method=function(){}

原型是全球性的。它可以被所有对象使用。
您甚至可以覆盖或删除标准方法。

如果要为对象定义一个新方法,那么它是本地的,并且仅用于对象的此实例


另一方面,如果在prototype范围内定义它,那么它的全局和方法是为所有实例定义的。我在这里写的是一个粗略的概述。关于原型的工作原理,还有一些其他的东西,但我尽量保持简单和基本

这篇博文对我所说的有一些很好的细节:

只有函数具有.prototype属性。实例具有.constructor属性。在您的示例中,“o”是对象的实例

所有构造函数都是函数

根据您使用的浏览器,实例将具有以下原型属性:

.__proto__ 
这是您通常认为函数的.prototype属性。大多数(所有?)版本的IE在实例上不提供“____________”(用于SO格式化的额外空间)属性。支持ECMA5的浏览器有一个名为getPrototypeOf()的方法,该方法返回实例的原型

因为构造函数是函数,所以它们具有.prototype属性。因此,o.constructor.prototype是以友好的跨浏览器方式访问原型的好方法。这里有一些警告,因为它可以被覆盖。有关更多信息,请参阅博客文章

因此,我们需要做的第一件事是重新编写代码,使语法能够像我们预期的那样工作。从现在开始,我将更改变量名称,使其更加清晰:

var foo = new Object(); //a new instance of Object
foo.foo_method = function(){ console.log('foo'); } //add a function called 'foo_method' to our instance

var bar = new Object(); // a new instance of Object
bar.constructor.prototype.bar_method = function(){ console.log('bar'); } //add a function called 'bar_method' to the Object prototype


foo.foo_method(); //logs "foo"
foo.bar_method(); //logs "bar"

bar.bar_method(); //logs "bar"

try{
    bar.foo_method(); 
}catch(err){
   console.log(err); //Uncaught TypeError: Object #<Object> has no method 'foo_method' or "TypeError"
}

//Alternate way to add methods to prototypes. Only works in non-IE browsers.
bar.__proto__.woohoo_method = function(){ console.log('woohoo'); }

foo.woohoo_method(); //logs "woohoo"
bar.woohoo_method(); //logs "woohoo"​​​​​
var foo=新对象()//对象的新实例
foo.foo_method=function(){console.log('foo');}//将名为'foo_method'的函数添加到我们的实例中
var bar=新对象();//对象的新实例
bar.constructor.prototype.bar_method=function(){console.log('bar');}//向对象原型添加一个名为'bar_method'的函数
foo.foo_方法()//日志“foo”
foo.bar_方法()//日志“条”
bar.bar_方法()//日志“条”
试一试{
bar.foo_方法();
}捕捉(错误){
console.log(err);//未捕获的TypeError:对象#没有方法“foo_method”或“TypeError”
}
//向原型添加方法的替代方法。仅适用于非IE浏览器。
bar._uuproto_uu.woohoo_umethod=function(){console.log('woohoo');}
foo.woohoo_方法()//日志“呜呼”
bar.woohoo_方法()//日志“呜呼”​​​​​

区别在于第二个不起作用。@MoatazElmasry,因为在本例中,“o”是Object的实例。它没有名为“prototype”的属性。试图设置o.prototype.method=function(){}会导致错误,因为它试图在“o”中不存在的属性上定义“method”。