JavaScript:创建新对象类型的方法
JavaScript: Which way to create a new object type
我现在正在写一些JS,但我不知道如何在JS中创建对象...在许多网站上,我找到了很多答案,但应该使用哪一个?首先,我认为没有什么不同。但我希望你们中的一些人能告诉我更多。
这里有三种方式:
// Way 1
var SomeObject = {
foo: "bar",
bar: "foo",
someMethod: function() {
//code
}
};
// Way 2
var SomeObject = function() {
var self = this;
this.foo = "bar";
this.bar = "foo";
this.someMethod = function() {
//code
}
}
// Way 3
var SomeObject = function() {
var self = this;
this.foo = "bar";
this.bar = "foo";
}
SomeObject.prototype.someMethod = function() {
//Code
}
第一种方法称为对象文字。第二和第三种方式是相同的,称为函数对象。在 JavaScript 中,函数是对象,上面的方式 2,3 仅在它们对 someMethod() 方法的实现上有所不同,而不是在对象定义/实现中。你也可以使用 var newObj = Object.create(Object.prototype),其中 newObj 将继承 Object.prototype。什么是最好的 . . .道格拉斯·克罗克福德(Douglas Crockford)说,对象文字声明是最好的,因为它更具可读性和紧凑性。
另外,也许你已经知道这一点,但是如果你是嵌套函数,你只需要创建var self = this。
三者不同:
第一个对象有属性foo
,而方式2和3没有。后者是可以创建具有 foo
属性的对象的构造函数。
和方式 3 也不同:方式 2 是使用 someMethod
方法传递对象的构造函数,而方式 3 则不然。方式 3 将在原型上定义一个级别的方法。
Way | constructor | instance has
| | own someMethod
----+-------------+---------------
1 | no | yes
2 | yes | yes
3 | yes | no
选择什么?
当您只需要一个对象实例(一个单例)时,您可能会使用方式 1。一旦您需要多个,则不建议使用方式1。
如果你的方法有很多代码,那么方式3几乎肯定是你想要的:你想避免为每个对象实例重新创建该函数。另一方面,如果方法不是在对象本身上定义,而是在原型上定义,则会产生轻微的开销。话虽如此,JavaScript 优化了代码,并且可能会消除这两个问题。但是方式 3 是最 OOP 的方法。
方式 3 的缺点是您无法访问私人成员,例如 self
.如果其代码依赖于this
,则必须注意在该原型的实例上调用这些方法(或显式绑定到该实例),否则结果可能是意外的。
- 实现比较方法的最佳实践是什么;s的比较类型是在运行时选择的
- Dynamics 2016内部部署Crm客户端脚本.选项集控件类型缺少方法
- 如何确保函数/方法参数为certian类型
- 在Javascript中调用对象方法时不是函数类型错误
- E4X中是否有一种方法可以将基元数据类型的XMLList转换为类似于Array.join()的Array
- 在输入类型提交按钮上调用 C# 方法
- 处理复杂类型时的声明方法
- JavaScript:创建新对象类型的方法
- 类型错误:对象 #<对象> 没有方法“身份验证”
- 未捕获的类型错误:Wordpress Jquery 幻灯片 - 对象没有方法
- 有没有一种方法可以通过列类型/属性来格式化MySQL单元格数据
- 未捕获的类型错误:无法调用方法'shift'Chrome中的Facebook JS库为null
- 使用each()方法来动画化代码类型
- 未捕获的类型错误:无法调用方法'至小写'的未定义
- 有没有一种方法可以在Typescript中自动检查数据类型的数据相等性
- 未捕获的类型错误:无法调用方法'每个'的未定义
- 未捕获的类型错误:对象#<节点列表>没有方法'addEventListener'
- 未捕获的类型错误:对象没有方法'sortContents'
- 是否有媒体查询类型方法可以根据设备切换js文件
- JavaScript中简单类型方法的委托