- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
在 Javascript 中定义可重用对象的基本方法有哪些?我说可重用是为了排除单例技术,比如直接用对象字面量表示法声明一个变量。我在某处看到 Crockford 在他的书中定义了四种这样的方法,但我宁愿不必为这一小段信息买一本书。
以下是我熟悉的方法:
用this
,用new
构造(我觉得这叫经典?)
function Foo() {
var private = 3;
this.add = function(bar) { return private + bar; }
}
var myFoo = new Foo();
使用原型(prototype),类似
function Foo() {
var private = 3;
}
Foo.prototype.add = function(bar) { /* can't access private, correct? */ }
返回文字,不使用 this
或 new
function Foo() {
var private = 3;
var add = function(bar) { return private + bar; }
return {
add: add
};
}
var myFoo = Foo();
我可以想到这些可能无关紧要的相对较小的变化。我缺少什么样式?更重要的是,各自的优缺点是什么?有没有推荐的可以坚持,或者是偏好问题和圣战?
最佳答案
使用原型(prototype)。从构造函数返回特定对象会使它们成为非构造函数,而将方法分配给 this
会使继承变得不那么方便。
优点:
如果一个人忘记了 new
,他们仍然会得到对象。
您可以创建真正私有(private)的变量,因为在构造函数中定义的对象的所有方法都共享其作用域。
缺点:
new
还是没有 new
。 new Foo() instanceof Foo
也会导致 false
。原型(prototype)
优点:
让构造函数保持整洁。
这是在 JavaScript 中做事的标准方式,所有内置构造函数都将它们的方法放在它们的原型(prototype)上。
继承变得更容易、更正确;你可以(也应该)使用 Object.create(ParentConstructor.prototype)
而不是 new ParentConstructor()
,然后从 中调用
。如果您想覆盖某个方法,可以在原型(prototype)上进行。ParentConstructor
>构造函数
您可以在创建对象后对其进行“修改”。
您可以扩展您无权访问的构造函数的原型(prototype)。
缺点:
它可能有点过于冗长,如果您想更改函数的名称,您还必须更改所有添加到原型(prototype)的函数。 (或者将原型(prototype)定义为一个大对象文字,并为 constructor
提供兼容的属性描述符。)
它们不共享特定于实例的范围,因此您不能真正拥有私有(private)变量。
this.*
优点:
缺点:
Array.prototype.slice.call(collectionLikeObject)
。关于Javascript 对象定义技术,优点和缺点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6195898/
我的一位教授给了我们一些考试练习题,其中一个问题类似于下面(伪代码): a.setColor(blue); b.setColor(red); a = b; b.setColor(purple); b
我似乎经常使用这个测试 if( object && object !== "null" && object !== "undefined" ){ doSomething(); } 在对象上,我
C# Object/object 是值类型还是引用类型? 我检查过它们可以保留引用,但是这个引用不能用于更改对象。 using System; class MyClass { public s
我在通过 AJAX 发送 json 时遇到问题。 var data = [{"name": "Will", "surname": "Smith", "age": "40"},{"name": "Wil
当我尝试访问我的 View 中的对象 {{result}} 时(我从 Express js 服务器发送该对象),它只显示 [object][object]有谁知道如何获取 JSON 格式的值吗? 这是
我有不同类型的数据(可能是字符串、整数......)。这是一个简单的例子: public static void main(String[] args) { before("one"); }
嗨,我是 json 和 javascript 的新手。 我在这个网站找到了使用json数据作为表格的方法。 我很好奇为什么当我尝试使用 json 数据作为表时,我得到 [Object,Object]
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
我听别人说 null == object 比 object == null check 例如: void m1(Object obj ) { if(null == obj) // Is thi
Match 对象 提供了对正则表达式匹配的只读属性的访问。 说明 Match 对象只能通过 RegExp 对象的 Execute 方法来创建,该方法实际上返回了 Match 对象的集合。所有的
Class 对象 使用 Class 语句创建的对象。提供了对类的各种事件的访问。 说明 不允许显式地将一个变量声明为 Class 类型。在 VBScript 的上下文中,“类对象”一词指的是用
Folder 对象 提供对文件夹所有属性的访问。 说明 以下代码举例说明如何获得 Folder 对象并查看它的属性: Function ShowDateCreated(f
File 对象 提供对文件的所有属性的访问。 说明 以下代码举例说明如何获得一个 File 对象并查看它的属性: Function ShowDateCreated(fil
Drive 对象 提供对磁盘驱动器或网络共享的属性的访问。 说明 以下代码举例说明如何使用 Drive 对象访问驱动器的属性: Function ShowFreeSpac
FileSystemObject 对象 提供对计算机文件系统的访问。 说明 以下代码举例说明如何使用 FileSystemObject 对象返回一个 TextStream 对象,此对象可以被读
我是 javascript OOP 的新手,我认为这是一个相对基本的问题,但我无法通过搜索网络找到任何帮助。我是否遗漏了什么,或者我只是以错误的方式解决了这个问题? 这是我的示例代码: functio
我可以很容易地创造出很多不同的对象。例如像这样: var myObject = { myFunction: function () { return ""; } };
function Person(fname, lname) { this.fname = fname, this.lname = lname, this.getName = function()
任何人都可以向我解释为什么下面的代码给出 (object, Object) 吗? (console.log(dope) 给出了它应该的内容,但在 JSON.stringify 和 JSON.parse
我正在尝试完成散点图 exercise来自免费代码营。然而,我现在只自己学习了 d3 几个小时,在遵循 lynda.com 的教程后,我一直在尝试确定如何在工具提示中显示特定数据。 This code
我是一名优秀的程序员,十分优秀!