JavaScript 对象 : Literal Vs Constructor

标签 javascript html oop prototype

<分区>

对于创建 Javascript 对象,我们可以使用 Literal 或 Constructor 方式; 在构造方法中,我们说;

function myObj(){
this.myProp1 = "abc";
this.myProp2 = "xyz";
}

按照字面意思,我们说;

var myObj = {
myProp1:"abc",
myProp2:"xyz",
}

我的问题是在声明属性时,为什么会有不同,比如为什么我们在构造函数方式中使用“this.myProp1”而不是在字面量方式中使用“this”?

最佳答案

两者之间的主要区别在于它们的使用方式。顾名思义,构造函数旨在创建和设置一个对象的多个实例。另一方面,对象文字是一次性的,如字符串和数字文字,更常用作配置对象或全局单例(例如,用于命名空间)。

第一个例子有一些微妙之处需要注意:

当代码被执行时,一个匿名函数被创建并分配给myObj,但没有其他任何事情发生。 methodOnemethodTwo 在显式调用 myObj 之前不存在。
根据 myObj 的调用方式,方法 methodOnemethodTwo 将在不同的地方结束:

myObj():
由于未提供上下文,this 默认为 window 并且方法将变为全局。

var app1 = new myObj():
由于 new 关键字,一个新对象被创建并成为默认上下文。 this 引用新对象,方法将被分配给新对象,该对象随后被分配给 app1。但是,myObj.methodOne 仍未定义。

myObj.call(yourApp):
这调用了我的 myObj 但将上下文设置为另一个对象 yourApp。这些方法将被分配给 yourApp,覆盖具有相同名称的 yourApp 的任何属性。这是一个非常灵活的方法,允许在 Javascript 中进行多重继承或混合。

构造函数还允许另一个级别的灵 active ,因为函数提供闭包,而对象字面量不提供。例如,如果 methodOne 和 methodTwo 依赖对象私有(private)的公共(public)变​​量密码(不能在构造函数外部访问),这可以非常简单地通过执行以下操作来实现:

var myObj = function(){
    var variableOne = "ABCD1234";

    this.methodOne = function(){
       // Do something with variableOne
       console.log(variableOne);
    };
    this.methodTwo = function(){
       // Do something else with variableOne
    };
};

myObj();

alert(variableOne); // undefined
alert(myObj.variableOne); // undefined

如果你想让 variableOne 暴露(公开)你会这样做:

var myObj = function(){
    this.variableOne = "ABCD1234";

    this.methodOne = function(){
       // Do something with variableOne
       console.log(this.variableOne);
    };
    this.methodTwo = function(){
       // Do something else with variableOne
    };
};

myObj();

alert(variableOne); // undefined
alert(myObj.variableOne); // ABCD1234   

关于JavaScript 对象 : Literal Vs Constructor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15008710/

相关文章:

oop - 信息隐藏和属性

python - 一个小项目的想法,我应该使用 Python 吗?

javascript - 重写一个javascript方法

javascript - 在 npm 构建期间找不到模块 @restart/context/forwardRef

javascript - 表单提交不起作用

html - 在同一行中有 Logo 和文本 - twitter bootstrap

javascript - 使用javascript将javascript注入(inject)文本框?

javascript - 为 EditorFor 提供 ID 属性

javascript - 我怎样才能 promise 这个功能,这样它就不会阻止我的服务器启动?

css - 左右两个 div,自动宽度