Javascript函数和对象

Javascript函数和对象,javascript,Javascript,我正在学习Javascript,我已经使用PHP大约10年了,所以我对Javascript有一些了解,主要是使用jQuery并将其整合在一起,我认为是时候我投入一些精力来更好地学习它了,所以我一直在阅读它 下面是我定义和调用一些函数的示例 方法1 function testFunction1() { console.log('TestFunction1() was ran'); } testFunction1(); 方法2 var testFunction2 = function()

我正在学习Javascript,我已经使用PHP大约10年了,所以我对Javascript有一些了解,主要是使用jQuery并将其整合在一起,我认为是时候我投入一些精力来更好地学习它了,所以我一直在阅读它

下面是我定义和调用一些函数的示例

方法1

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。简单

如果要重复创建对象,则取决于。你会创造数万个这样的物体吗?速度是最重要的?如果是这样,您可能需要一个构造函数。如果不是,那就取决于你最喜欢什么。我发现一个简单的函数可以返回一个最清晰、最灵活的对象,但这只是我的偏好。许多比我聪明得多的开发人员更喜欢构造函数

  • 3和4仍然是函数,但它们也是对象。1和2也是对象,也是函数。所有函数都是对象——JavaScript具有一流的函数

  • 它实例化一个对象。使用
    new
    调用的函数是构造函数。它们创建对象

  • 它们是完全一样的东西。就像在#1中一样,嵌套级别对任何东西的类型都没有影响

  • 不,因为它们都是等价的。
    函数
    是一个
    对象
    ,无论它在哪里。但是,一般来说,为了名称空间的目的,您会避免大量嵌套,因为这会降低代码的速度,而不会带来太多的清晰性好处。JavaScript在设计时并没有真正考虑名称空间

  • 阿法克

    1) 在JS中,所有函数都是对象。在3的例子中,是的,它会被视为一个对象,因为它在花括号内

    3) 它们是一样的,但是一种让事情变得更复杂的方法是“返回”一个最高级别的属性,而不是另一个,它本质上隐藏了未返回的函数,并提供了一种创建公共和私有方法的方法

    4) 可能4最接近我认为你想要的,并遵循一些合理的方法,但正如Andrew所说,我倾向于将4更改为如下内容:

    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,原始数字、布尔值和字符串也不被视为对象。你的例子甚至不运行。。。你为什么要这么做<代码>功能