面向对象与点分表示法

时间:2017-09-29 14:55:07

标签: javascript

知道以下示例用于实例化对象,但我试图找出何时使用它:

install.packages("pkgname_x.x-x.zip", repos=NULL)  # not contriburl

我是一所旧学校,但我编写JavaScript的方式是这样的:

function Person(){
  this.age = 0
}

var p = new Person()

我想我永远不需要两个人对象的实例。我认为我所做的就是将旧学校的思维应用到JavaScript的虚线符号中,而且我在任何编程中都没有真正使用过对象。

如果您想出一个使用对象的示例,并且我的任务是解决相同的用例,那么我会在程序上解决它吗?或者是否有一个用例,面向对象显然是更好的解决方案?

2 个答案:

答案 0 :(得分:1)

如果你从不需要一个person对象的两个实例,那么就不需要ES6类,或者函数和new,或<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" /> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script> <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script> <link href="https://gitcdn.github.io/bootstrap-toggle/2.2.2/css/bootstrap-toggle.min.css" rel="stylesheet" /> <script src="https://gitcdn.github.io/bootstrap-toggle/2.2.2/js/bootstrap-toggle.min.js"></script> <link rel="stylesheet" href="css/styles.css" /> <div class="container"> <div class="row"> <label>End System Date:</label> <h4 class="inline-block">1 Jul 2017</h4> </div> </div> new(以及所有相关机制)的价值来自当你需要:

  • 有多个给定类型的对象

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

  • 使用继承

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

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

答案 1 :(得分:1)

使用一个而不是另一个有效performance concerns,但它们与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); }
}