js面向?qū)ο缶幊谈攀?/h2>

問(wèn):在js里面被<code>new</code>之后的函數(shù)和普通的函數(shù)有何區(qū)別嗎?

1. New命令#

1.1 基本用法
<code>new</code>命令的作用,就是執(zhí)行<code>構(gòu)造函數(shù)</code>,返回一個(gè)<code>實(shí)例對(duì)象</code>。

var Person = function(name){
    this.name = name;
}

var p1 = new Person("張三");
var p2 = new Person("李四");

//p1和p2都是Person這個(gè)類(構(gòu)造函數(shù))的實(shí)例
p1.name//張三
p2.name//李

如果不用<code>new</code>將函數(shù)賦值給一個(gè)變量,會(huì)如何呢?

var Person = function(name){
    this.name = name;
}

var p1 =  Person("張三"); 
p1//undefined
name//張三
var p2 =  Person("李四");
p2//unddefined
name//李四

var Animate = function(type){
  'use strict';
  this.type = type
}

var dog = new Animate("dog");
//TypeError: Cannot set property 'type ' of undefined
//因?yàn)?use strict 是嚴(yán)格模式

上面代碼分別調(diào)用兩次<code>Person</code>函數(shù),但由于<code>Person</code>函數(shù)沒有返回值,所以,<code>p1,p2</code>都為<code>undefined</code>。<code>this</code>表示當(dāng)前作用域,由于沒有<code>new</code>,當(dāng)前的作用域仍然是全局的。所以,最后<code>name</code>為"李四"

1.2 new原理

創(chuàng)建一個(gè)空對(duì)象,作為將要返回的對(duì)象實(shí)例
將這個(gè)空對(duì)象的原型,指向構(gòu)造函數(shù)的<code>prototype</code>屬性
將這個(gè)空對(duì)象賦值給函數(shù)內(nèi)部的<code>this</code>關(guān)鍵字
開始執(zhí)行構(gòu)造函數(shù)內(nèi)部的代碼

如果構(gòu)造函數(shù)內(nèi)部有<code>return</code>語(yǔ)句,而且<code>return</code>后面跟著一個(gè)對(duì)象,<code>new</code>命令會(huì)返回<code>return</code>語(yǔ)句指定的對(duì)象;否則,就會(huì)不管<code>return</code>語(yǔ)句,返回<code>this</code>對(duì)象

var Vehicle = function () {
   this.price = 1000; 
   return 1000;
};
(new Vehicle()) === 1000
//上面代碼中,構(gòu)造函數(shù)Vehicle的return語(yǔ)句返回一個(gè)數(shù)值。
//這時(shí),new命令就會(huì)忽略這個(gè)return語(yǔ)句,返回“構(gòu)造”后的this對(duì)象

但是,如果<code>return</code>語(yǔ)句返回的是一個(gè)跟<code>this</code>無(wú)關(guān)的新對(duì)象,<code>new</code>命令會(huì)返回這個(gè)新對(duì)象,而不是<code>this</code>對(duì)象。這一點(diǎn)需要特別引起注意。

var Vehicle = function (){
 this.price = 1000;
 return { price: 2000 };
};
(new Vehicle()).price// 2000

另一方面,如果對(duì)普通函數(shù)(內(nèi)部沒有<code>this</code>關(guān)鍵字的函數(shù))使用<code>new</code>命令,則會(huì)返回一個(gè)空對(duì)象。

function getMessage() { 
  return 'this is a message';
}
var msg = new getMessage();
msg // {}
typeof msg // "Object"

<code>new</code>命令簡(jiǎn)化的流程

function Persion(name){
    this.name = name;
}

function _new(/* 構(gòu)造函數(shù) */ constructor, /* 構(gòu)造函數(shù)參數(shù) */ param1) {
  // 將 arguments 對(duì)象轉(zhuǎn)為數(shù)組
  var args = [].slice.call(arguments);
  // 取出構(gòu)造函數(shù)
  var constructor = args.shift();
  // 創(chuàng)建一個(gè)空對(duì)象,繼承構(gòu)造函數(shù)的 prototype 屬性
  var context = Object.create(constructor.prototype);
  // 執(zhí)行構(gòu)造函數(shù)
  var result = constructor.apply(context, args);
  // 如果返回結(jié)果是對(duì)象,就直接返回,則返回 context 對(duì)象
  return (typeof result === 'object' && result != null) ? result : context;
}

var p = _new(Persion, "xxx");
console.info(p.name); //xxx

2. Object對(duì)象與繼承#

2.1 Object.getOwnPropertyNames()
<code>Object.getOwnPropertyNames</code>方法返回一個(gè)數(shù)組,成員是對(duì)象本身的所有屬性的鍵名,不包含繼承的屬性鍵名。

Object.getOwnPropertyNames(Date);
//["length", "name", "arguments", "caller", "prototype", "now", "parse", "UTC"]

var a = {};
Object.getOwnPropertyNames(a);
//[]

2.2 Object.prototype.hasOwnProperty()
對(duì)象實(shí)例的<code>hasOwnProperty</code>方法返回一個(gè)布爾值,用于判斷某個(gè)屬性定義在對(duì)象自身,還是定義在原型鏈上

Date.hasOwnProperty('length')// true
Date.hasOwnProperty('toString')// false

2.3 in 運(yùn)算符和 for…in 循環(huán)
in運(yùn)算符返回一個(gè)布爾值,表示一個(gè)對(duì)象是否具有某個(gè)屬性。它不區(qū)分該屬性是對(duì)象自身的屬性,還是繼承的屬性。

'length' in Date // true
'toString' in Date // true
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類相關(guān)的語(yǔ)法,內(nèi)部類的語(yǔ)法,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法,線程的語(yǔ)...
    子非魚_t_閱讀 34,854評(píng)論 18 399
  • 一直以為,如果沒有王政君,王莽不會(huì)篡權(quán),漢朝的歷史也許不會(huì)分為西漢和東漢了…… 然而,王莽還是篡了權(quán),漢朝還是分了...
    小笨的日記閱讀 568評(píng)論 2 4
  • 詞作:動(dòng)力單車 ………………………… 在一個(gè)寂靜的深夜里 幾段思緒 就像長(zhǎng)江水翻來(lái)覆去 就這樣坐起 翻看多年前的相...
    云山任野閱讀 360評(píng)論 0 3
  • 感情里最怕的是,他從沒說(shuō)過(guò)一句“我愛你”,你卻句句都是“我愿意”。 01 前陣子寫了一篇《我主動(dòng)找你聊天,就是因?yàn)?..
    徐慕熹微閱讀 1,034評(píng)論 13 25

友情鏈接更多精彩內(nèi)容