Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/460.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 面向对象与虚线表示法_Javascript - Fatal编程技术网

Javascript 面向对象与虚线表示法

Javascript 面向对象与虚线表示法,javascript,Javascript,我知道下面的示例用于实例化一个对象,但我正试图找出何时使用它: function Person(){ this.age = 0 } var p = new Person() 我是老派,但我编写JavaScript的方式如下: var person = {} person.age = 0 person.myMethod = function() { } 我想我永远不需要两个person对象的实例。我认为我所做的是将老派思想应用到JavaScript的虚线符号中,我从来没有在任何编程中真正

我知道下面的示例用于实例化一个对象,但我正试图找出何时使用它:

function Person(){
  this.age = 0
}

var p = new Person()
我是老派,但我编写JavaScript的方式如下:

var person = {}
person.age = 0
person.myMethod = function() {
}
我想我永远不需要两个person对象的实例。我认为我所做的是将老派思想应用到JavaScript的虚线符号中,我从来没有在任何编程中真正使用对象


如果你提出一个使用对象的例子,而我的任务是解决同一个用例,那么我会按程序解决它吗?或者有面向对象显然是更好的解决方案的用例吗?

如果您不需要两个person对象实例,那么就不需要ES6类、函数和新的、或
函数。prototype
当您需要:

  • 具有给定类型的多个对象

  • 确定给定对象是否为给定类型

  • 使用继承

  • 扩展已存在的类型,并查看已存在对象中反映的那些扩展

如果你从来都不需要做这些事情,那么使用对象文字和点符号来构造你的对象似乎是完全合理的。

使用其中一个而不是另一个是有效的,但它们与JS运行时的实现方式密切相关。。。如果您可以通过编译器可以优化的语法声明对象的“形状”,那么变异对象将自动退出

您的问题主要是以观点为导向的,但是最近的JS特性倾向于一种“功能性”风格,您可以尝试不改变对象,在您的示例中:

const person = {
     age: 10,
     myMethod() {}
}
而不是点符号

请注意,使用词汇上下文
this
只是传递一个隐式参数,这也可以在闭包或显式中完成

使用闭包意味着为实体的每个实例创建一个新函数,这显然有成本,显式传递(通常有第一个参数)意味着不能使用点表示法,使用原型将只创建函数的一个实例,但在通过原型链解析函数时会有成本

// closure
const name = "john";
const person = { 
    name, 
    meet ( other ) { console.log(name + " says hello to " + other.name); }
};

// passing explicitly
function meet ( p1, p2 ) {

    console.log(p1.name + " says hello to " + p2.name);

}


// using the prototype with the class syntax
class Person {
    constructor (name) { this.name = name; }
    meet (other) { console.log(this.name + " says hello to " + other.name); }
}

为什么不使用新的ES6类语法?点/括号表示法、nor对象实例都是新的javascript机制。如果您不需要某个对象的多个实例,那么第二个就可以了。但有时您可能希望多个对象具有相同的方法和类似的属性。就像拥有40个人的对象一样,您是愿意显式地编写每个对象,还是只定义一个构造函数/方法/等等,然后在每次需要时创建一个新实例。这个问题的答案大多基于观点。这完全取决于手头的情况。我同意这是基于观点的,但它是如何编写JavaScript的基础。