关于JS中OOP的一些基本问题

时间:2017-04-16 12:30:09

标签: javascript oop object

目前我正在学习对象,但我不确定某些词语和描述的术语。我相信你们中的一些人可以帮助我:)

代码示例:

header( "location: readMore.php?id=".$post[ 'post_id' ]); 

我的问题:

  1. 上面的代码与以下代码之间是否存在差异:

    function Person(name) {
        this.name = name,
        this.introduce = function() {
            console.log("My name is " + this.name);
        }
    }
    
    var jon = new Person("Jon")
    jon.introduce();
    
  2. 哪一个更好的做法?我猜第一个代码片段,因为代码较少。

    1. 现在的术语。
    2. 2.1我是否正确,考虑到开头的代码示例,您将以下代码段称为原型?

      var Person = function(name) {
          this.name = name,
          this.introduce = function() {
              console.log("My name is " + this.name);
          }
      }
      
      var jon = new Person("Jon")
      jon.introduce();
      

      2.2我是否正确,在开头的代码示例中,您将下面的代码段调用为构造函数(-function)?

          function Person(name) {
              this.name = name,
              this.introduce = function() {
                  console.log("My name is " + this.name);
              }
          }
      

      谢谢,祝福东方! :)

2 个答案:

答案 0 :(得分:2)

第1点:大词

function Person(name) {
    this.name = name,
    this.introduce = function() {
        console.log("My name is " + this.name);
    }
}

var jon = new Person("Jon")
jon.introduce();

此功能的名称为“人物”。这称为功能声明

var Person = function(name) {
    this.name = name,
    this.introduce = function() {
        console.log("My name is " + this.name);
    }
}

var jon = new Person("Jon")
jon.introduce();

这个功能是匿名的,没有名字。我们可以分配名称但是  因为变量可用于执行函数,所以不需要它。这称为函数表达式

您可以在此处阅读有关Function语句和表达式的更多信息:

https://javascriptweblog.wordpress.com/2010/07/06/function-declarations-vs-function-expressions/

第2点:执行(吊装)

由于提升的工作方式,在定义函数后必须调用赋给变量的函数。

因此,对于第一种情况,可以在其下方或上方调用函数

但是对于第二种情况,必须在之后调用函数。因为它存储在变量中。在函数之前调用它将返回undefined。它不会给出错误。变量存在于内存空间中,但此时未定义。

您可以在此处阅读有关变量和功能提升的更多信息:

http://adripofjavascript.com/blog/drips/variable-and-function-hoisting

第3点:函数构造函数:

在您的情况下,用于函数的术语是“函数构造函数”,因为您实际上是使用函数作为Person对象的构造函数来定义它的属性。

答案 1 :(得分:1)

  1. 这只是function expression vs. declaration之间的区别。我会使用看似简单的声明,而不是分配给变量的未命名匿名函数。

    1. 该片段显示jon.constructor也返回的构造函数。由该构造函数构造的人的原型 - 您可以通过Object.getPrototypeOf(jon)Person.prototype访问 - 几乎是空的。分配this.name = name不会为原型添加名称属性,而是添加当前创建的对象。

    2. 应用于返回新构造对象的构造函数的new operator