4. 关於 Constructor Function

(想直接看题目的话可以移到最後一个标题!)

在准备回答问题前,先复习几个观念:

Constructor Function


→ Constructor建构子,用途是能制作大量相似的 object ( array, function...都是object)。

通常使用的形式为:

  • 字首大写
  • 使用 "new" keyword → 用於创造empty object

范例:

function Person(name, age, country){ // 字首大写

    console.log(this);  // 这里的this 会指向一个 empty object "Person {}"
    
    this.name = name,
    this.age = age,
    this.country = country
}

let Tina = new Person("Tina", 22, "Taiwanese");  // 使用 "new" keyword

console.log(Tina); // Person {name: "Tina", age: 22, country: "Taiwanese"}

范例执行的动作:

  1. console.log(this);
    这里的This是指被创造出来的Tina本身,也就是创造了一个empty object "Person {}"。
  2. this.name = name
    则是在定义 object 里的属性(property),所以这里我们定义了"name", "age", "country" 三种属性。
  3. let Tina = new Person("Tina", 22, "Taiwanese");
    会将我们传入的参数(parameter)分配给属性,new出一个新的object。
  4. console.log(Tina);
    确认这个object涵盖的属性。

( 注意! console.log(this);的"Person {}"展开来可能还是会看到里面不是空的,还是会有内容。
这是因为物件传参考的特性,所以之後被定义的属性会同时被看到,这里可以大概知道就好。 )

那如果没有new会发生什麽事呢? 我们可以试试看:

function Person(name, age, country){ 
    console.log(this);  // output: Window {0: global, window: Window, …}
    this.name = name,
    this.age = age,
    this.country = country
}

let Tina = Person("Tina", 22, "Taiwanese"); 

console.log(Tina); // output: undefined

console.log(this); 的this,会变成指向浏览器的Global object Window

然後在Window里找不到定义属性的方法,所以Tina就变成了undefined(被消失

所以没有new就不会创造empty object,也会影响this的指向,
然後new不出object你的建构子就白搭了。

Constructor Function可以定义属性,也可以定义方法(methods)。
我们可以看到下面的例子:

function Person(name, age, country){ 

    this.name = name,
    this.age = age,
    this.country = country,
    
    this.sayHi = function(){
    console.log(this.name + " says Hi.");  // 这里的this会指向Person {}
    }
}

let Tina = new Person("Tina", 22, "Taiwanese");  

console.log(Tina); // Person {name: "Tina", age: 22, country: "Taiwanese", sayHi: ƒ}

Tina.sayHi(); // Tina says Hi.

(但这种建立物件的方式,会占用到大量的记忆体,所以之後会补充Prototype的概念。)

那跟今天的主题比较相关的提问是:

function Person(){}、var person = Person()和var person = new Person()之间有何不同?

( 问题参考自: 前端工程师面试问题集 ★ Front-end Job Interview Questions )

简而言之:

  1. function Person(){}
    → 创造一个建构子Person,可以定义属性和方法,并用於创造object。

  2. var person = Person()
    → 如果没有写new的话,Person就不会创造empty object,this会变成指向浏览器里的window物件。
    → 而window里找不到欲定义的属性,那麽建立的person会回传undefined

  3. var person = new Person()
    → new 会创造empty object,赋值给person。
    → person就会是一个可以具备Person()属性,且具有属性值的object。

【如内文有误还请不吝指教>< 感谢阅览至此的各位:D 】

-----正文结束-----

本来是想写this的,但this会用到这个的延伸观念,所以今天来写Constructor Function。


<<:  Day 05:我不是资深工具人

>>:  Day5 : Golang 的变数

Day20:今天来聊一下Microsoft 365 DLP的识别/监视及自动保护敏感资讯

Microsoft 365 DLP(资料外泄防护)警示将协助我们进行调查找出完整的事件范围。 DLP...

【Day13】Latch 的生成条件以及如何避免(下)

Latch 的生成条件 上一篇讲解了什麽是 latch,其又与 flip-flop 差在哪,也解释了...

不要为了 Unit Test 而写 Unit Test

不管是哪种测试,都是为了确保程序码的品质,以及是否符合需求规格。而单元测试是工程师确保自身产出的一种...

Render Functions

今天要介绍的是Render Functions 先来看一段官网对render function的介绍...

待更新

待更新待更新待更新待更新待更新待更新待更新待更新待更新待更新待更新待更新待更新待更新待更新待更新待更...