Javascript函数和对象
我正在学习Javascript,我已经使用PHP大约10年了,所以我对Javascript有一些了解,主要是使用jQuery并将其整合在一起,我认为是时候我投入一些精力来更好地学习它了,所以我一直在阅读它 下面是我定义和调用一些函数的示例 方法1Javascript函数和对象,javascript,Javascript,我正在学习Javascript,我已经使用PHP大约10年了,所以我对Javascript有一些了解,主要是使用jQuery并将其整合在一起,我认为是时候我投入一些精力来更好地学习它了,所以我一直在阅读它 下面是我定义和调用一些函数的示例 方法1 function testFunction1() { console.log('TestFunction1() was ran'); } testFunction1(); 方法2 var testFunction2 = function()
function testFunction1() {
console.log('TestFunction1() was ran');
}
testFunction1();
方法2
var testFunction2 = function() {
console.log('TestFunction2() was ran');
}
testFunction2();
方法3
var TestFunction3 = {
flag: function() {
console.log('TestFunction3.flag() was ran');
},
unflag: function() {
console.log('TestFunction3.unflag() was ran');
}
};
TestFunction3.flag();
TestFunction3.unflag();
方法4
var TestFunction4 = {
Like: {
comment: function() {
console.log('TestFunction4.Like.comment() was ran');
},
user: function() {
console.log('TestFunction4.Like.user() was ran');
}
},
Unlike: {
comment: function() {
console.log('TestFunction4.Unlike.comment() was ran');
},
user: function() {
console.log('TestFunction4.Unlike.user() was ran');
}
}
};
TestFunction4.Like.comment();
TestFunction4.Like.user();
TestFunction4.Unlike.comment();
TestFunction4.Unlike.user();
我理解方法1和2只是一个基本的函数调用 1)
方法3和4是我的问题的起点,从其他帖子和阅读中,我不知道这些是否仍然被认为是应用了名称空间的基本函数,或者这些是否会被视为对象 2)
我曾经看到过,有时会用
new
这个词调用对象,但是在浏览器中运行所有这些都很好,所以我猜这不是一个对象?如果它不是一个对象,我将如何使它成为一个对象
3) 例3和例4基本相同,只是例4的函数定义比例3更深一层,例3和例4有名字吗,或者它们被认为是同一件事 4)
最后,在所有4个示例中,这4种方法中是否有一种优于另一种
对不起,1中的所有问题都是相关的,我不认为我需要为这个问题开始4个单独的问题。3是一个对象。它具有对象属性,对象属性本身具有函数属性。4是相同的想法,只是嵌套较少 至于使用
new
关键字,这只是创建对象的一种方法。使用new
调用函数时,称为构造函数调用。这是调用函数的四种方式之一。为完整起见,其他三个是方法调用、函数调用和应用调用
如果您想将函数用作构造函数,按照惯例,您应该以大写字母开头,然后用new
关键字调用它。这将基于object.prototype创建一个空白对象,并将其设置为This
。使用此对象创建模式时,您可以将属性直接添加到this
,即this.foo=12
将通过修改函数的原型来添加该对象的方法
YourConstrutor.prototype.newMethod = function() {
alert(this.foo);
};
请注意,使用构造函数有很多困难,特别是如果您想要实现继承的话
通过从“常规”函数返回对象,可以更简单地创建对象:
function createCar() {
return {
prop1 : 12,
someFunc: function() {
alert(this.prop1);
}
}
}
这也使信息隐藏变得容易:
function createCar() {
var protectedInfo = "haha I'm protected"; ///not visible outside this function
return {
prop1 : 12,
showProtectedData: function() {
alert(protectedInfo);
},
someFunc: function() {
alert(this.prop1);
}
}
}
(您也可以使用构造函数实现信息隐藏,但受保护的信息对您在原型上放置的方法不可见;受保护的信息仅对您手动添加到中的方法可见。
)
这里唯一的缺点是创建会稍微慢一些,因为它每次都从头创建someFunc
方法;对于构造函数,它将作为原型的一部分存在一次
4.哪一个更好?如果只想创建单个对象,请使用3或4。简单
如果要重复创建对象,则取决于。你会创造数万个这样的物体吗?速度是最重要的?如果是这样,您可能需要一个构造函数。如果不是,那就取决于你最喜欢什么。我发现一个简单的函数可以返回一个最清晰、最灵活的对象,但这只是我的偏好。许多比我聪明得多的开发人员更喜欢构造函数
new
调用的函数是构造函数。它们创建对象函数
是一个对象
,无论它在哪里。但是,一般来说,为了名称空间的目的,您会避免大量嵌套,因为这会降低代码的速度,而不会带来太多的清晰性好处。JavaScript在设计时并没有真正考虑名称空间var TestFunction4 = (function(){
return {
flag: function() {
console.log('TestFunction4.flag() was ran');
},
unflag: function() {
console.log('TestFunction4.unflag() was ran');
}
}
})();
TestFunction4.flag();
TestFunction4.unflag();
注意方法尾部的括号,强制函数立即执行,并使其在运行前对应用程序的其余部分可用(比如intellisense)
编辑:
这就是我如何使用“private”函数来回应“why would do This”(为什么要这样做)的评论:
var TestFunction4 = (function(){
//private function
var private = {
aPrivateFunction: function(a) {
return a + 1;
}
}
//public return object
var public = {
flag: function() {
console.log('Calling private function aPrivateFunction(10) expecting 11');
console.log('result' + private.aPrivateFunction(10));
console.log('TestFunction4.flag() was ran');
},
unflag: function() {
console.log('TestFunction4.unflag() was ran');
}
}
//return things to expost publicly
return public;
})();
你可能会从阅读中受益:至少可以回顾一下。除了
null
和undefined
之外,一切都是一个对象。如果你有空闲时间,可以看看Douglas Crockford的文章。相对较短的书,读完后,我想你的问题的答案应该很清楚。@zzzzBov:null
是一个对象。@zzzzBov,原始数字、布尔值和字符串也不被视为对象。你的例子甚至不运行。。。你为什么要这么做<代码>功能