在JavaScript中有很多方法可以完成相同的操作。但是,我已经掌握了一些方式,但坦率地说,有些方式我不理解。有人可以帮我澄清一些事情吗?(我首先在PHP中学习了OOP。)
所以可以这样制作一个类:
var object = new class(constructparams) {
var private_members; // Can be accessed from within the code inside this definition only.
this.public_members; // Can be accessed from everywhere.
var private_functions = function() {}
this.public_functions = function() {}
}
object.prototype.semi_public_members = function() {
// Will be public, but can only access public members and methods.
// E. g. private_members; is not available here.
}
到目前为止,这一切正确吗?
然后有人喜欢使用自执行匿名函数方法来创建名称空间。这样做的目的是什么,当您在上面做同样的事情时,提供了一个命名空间?
最后,您有一个我不理解的对象文字符号。
var object = { // Something strange in here }
那里发生了什么事?是JSON吗?如何使用,如何使用。用这种方式代替我描述的方法有什么好处?您为什么要原型而不是第一次进行正确的分类?
通过示例解释 构造对象 中不同事物的行为:
// Defined as a variable from an anonymous function
// so that there is scope closure over variables
// shared across all instances and the prototype.
// If this isn't important, you don't need to close
// scope around it, so define directly
var ConstructedObject = (function constructorCreator () {
// Define any variables/methods to be shared across
// all instances but not polluting the namespace
var sharedVariable = 'foo';
// Next the actual constructor
function ConstructedObject () {
// Variables here are normally used to help
// each instance and will be kept in memory as
// long as the instance exists
var instanceVariable = 'bar';
// instance-specific properties get defined
// using the "this" keyword, these are the
// properties expected to be changed across
// each different instance
this.instanceProperty = true;
this.instanceMethod = function () { return instanceVariable; };
this.changeInstanceVar = function () { instanceVariable = 'foo'; };
// you do have access to the shared
// variables here if you need them.
}
// After the constructor, you set up the
// prototype, if any. This is an object of shared
// properties and methods to be inherited by every
// instance made by the constructor, and it also
// inherits the prototype's prototype, too.
// Lets use a literal object for simplicity.
ConstructedObject.prototype = {
// Accessing the instance to which a method
// applies is done using the "this" keyword,
// similar to in the constructor
sharedMethod : function () { return [sharedVariable, this.instanceMethod(),this.instanceProperty]; },
changeSharedVar : function () { sharedVariable = 'bar'; }
// properties may also be defined
};
// Finally, the constructor is returned so it
// can be kept alive outside of the anonymous
// function used to create it
return ConstructedObject;
// and the anonymous function is called to execute
// what we've done so far
})();
执行上述代码后,您将拥有一个构造器,该构造器创建具有实例特定变量和共享变量的对象。现在,通过创建两个实例并在进行一些更改之前和之后进行比较来查看它们的行为。
// First create the two instances
var myObjA = new ConstructedObject(),
myObjB = new ConstructedObject();
// Now compare them, the sharedMethod method we
// used in the prototype offers an easy way to
// do this
console.log( myObjA.sharedMethod(), myObjB.sharedMethod() );
// ["foo", "bar", true] ["foo", "bar", true]
// Next lets change the different variables in
// myObjB so we can see what happens, again the
// change* methods defined before let us do this
// easily
myObjB.changeInstanceVar();
myObjB.changeSharedVar();
// For completeness, lets also change the property
// on myObjB.
myObjB.instanceProperty = false;
// Now when we compare them again, we see that our
// changes to the myObjB instance have only changed
// the shared variables of myObjA
console.log( myObjA.sharedMethod(), myObjB.sharedMethod() );
// ["bar", "bar", true] ["bar", "foo", false]
这是两个已记录的语句,以便于查看
// myObjA myObjB
["foo", "bar", true] ["foo", "bar", true]
["bar", "bar", true] ["bar", "foo", false]
我还研究了如何使用Google Apps脚本通过Google Clasonal API使用Course.CourseWork.list列出作业,但当我运行答案中的代码时,我的日志显示正在加载,但似乎从未完成。
问题内容: 我有一类,我已经按一个属性对其进行了排序。现在,我需要做另一件事,需要创建另一种对数据进行排序的方式。我该如何做,所以我可以在两种方法之间进行选择。我知道的唯一命令是Collections.sort,它将从我要比较其数据的类中选择方法compareTo。 可能吗? 问题答案: 您需要执行的是自定义。然后使用: 具体来说,您可以编写:(这将创建一个实现的匿名类。) 如果您愿意,可以将它们
问题内容: 喜欢标题中的内容如何对.txt文件进行过滤? 我写了这样的东西,但有错误:( 问题答案: 在这里,您将找到一些工作示例。这也是JFileChooser中使用的FileFilter的一个很好的示例。 基础是,您需要重写FileFilter类,并在其accpet方法中编写自定义代码。上例中的accept方法是根据文件类型进行过滤: 或更简单易用的是FileNameFilter,它具有以fi
问题内容: 我想让一个微调框输入时间,就像这样:YoutubeVidéo 如果有人知道源代码隐藏在哪里,那将是完美的。但是,如果没有,我想尝试自己实现,但是我该如何使3个不同的(可聚焦的)文本区域像这样? 编辑:这是我所得到的,但是我希望能够选择小时数并增加小时数,而不仅仅是分钟数(和c的秒数相同) 这是我得到的结果: 谢谢 问题答案: 我认为选择编辑器各个部分的最佳方法是检查编辑器中的内容,并根
问题内容: 在我的数据库方案中,我需要一个自动增量主键。我如何实现此功能? PS要访问DynamoDB,我使用倍增极了Node.js的,模块 问题答案: 免责声明:我是Dynamodb-mapper项目的维护者 自动递增键的直观工作流程: 获得最后的柜台位置 加1 使用新数字作为对象的索引 保存新的计数器值 保存对象 这只是为了解释基本思想。绝对不要这样做,因为它不是原子的。在某些工作负载下,您可
问题内容: 可能是JavaScript中鲜为人知的部分,位于原型链旁边。 所以问题是:如何… …实际上是创建一个对象,并定义其原型链/构造函数/等? 最好是显示一个替代方案,以充分理解该关键字。 问题答案: 的操作者使用内部方法,它基本上具有下列功能: 初始化新的本机对象 设置此对象的内部,指向Function 属性。 如果函数的属性不是对象(则使用原始值,例如Number,String,Bool