new 原理及模擬實現

2021-09-11 14:12:30 字數 2933 閱讀 5910

new 運算子建立乙個使用者定義的物件型別的例項或具有建構函式的內建物件的例項。

舉個栗子

function car(color) 

car.prototype.start = function

() var car = new car("black");

car.color; // 訪問建構函式裡的屬性

// black

car.start(); // 訪問原型裡的屬性

// black car start

複製**

可以看出 new 建立的例項有以下 2 個特性

注意點

es6新增 symbol 型別,不可以使用 new symbol(),因為 symbol 是基本資料型別,每個從symbol()返回的 symbol 值都是唯一的。

number("123"); // 123

string(123); // "123"

boolean(123); // true

symbol(123); // symbol(123)

new number("123"); // number

new string(123); // string

new boolean(true); // boolean

new symbol(123); // symbol is not a constructor

複製**

new操作符的工作原理

廢話不多說,直接上**

var newobj = function(func)

t.prototype = func.prototype

var o = t

var k =func.call(o);

if(typeof k === 'object')else

}var parent1 = newobj(parent) //等價於new操作

複製**

demo:

/**

* new2 new關鍵字的**實現演示

* @param func 被new的類 (建構函式)

*/function new2(func)

// 實驗

functionm

() let m = new2(m); // 等價於 new m 這裡只是模擬

console.log(m instanceof m); // instanceof 檢測例項

console.log(m instanceof object);

console.log(m.__proto__.constructor === m);

複製**

object.create 相容實現

let obj1 = ;

object._create = (o) => ; // 臨時的建構函式

fn.prototype = o;

return new fn;

}let obj2 = object._create(obj1);

console.log(obj2.__proto__ === obj1); // true

console.log(obj2.id); // 1

// 原生的object.create

let obj3 = object.create(obj1);

console.log(obj3.__proto__ === obj1); // true

console.log(obj3.id); // 1

複製**

完整**:

function new2(myfun, ...list) 

function car(color, name)

car.prototype.fun=function

()

var obj=new2(car,123,'小花');

console.log(obj)

console.log(obj.__proto__===car.prototype);

console.log(car.prototype.isprototypeof(obj))

console.log(object.prototype.isprototypeof(obj))

console.log(obj instanceof car)

console.log(obj.constructor===car)

複製**

有什麼問題?

function new2(myfun, ...list) 

function car(color, name)

car.prototype.fun=function

()

var obj=new2(car,123,'小花');

console.log(obj)

console.log(obj.__proto__===car.prototype);

console.log(car.prototype.isprototypeof(obj))

console.log(object.prototype.isprototypeof(obj))

console.log(obj instanceof car)

console.log(obj.constructor===car);

var obj=new2(null,123,'小花');

複製**

模擬實現js的new

目錄new是什麼 一句話介紹new new運算子建立乙個使用者自定義的物件型別的例項,或者具有建構函式的內建物件型別之一。看下下面的 來了解new操作符都做了什麼事情 class constructor function person name,age 每個函式都有prototype物件屬性 在類的...

Tomcat工作原理及簡單模擬實現

tomcat應該都不陌生,我們經常會把寫好的 打包放在tomcat裡並啟動,然後在瀏覽器裡就能愉快的呼叫我們寫的 來實現相應的功能了,那麼tomcat是如何工作的?一 tomcat工作原理 我們啟動tomcat時雙擊的startup.bat檔案的主要作用是找到catalina.bat,並且把引數傳遞...

new的原理及實現

new運算的過程 1 建立乙個空物件 3 繫結 this 將物件作為建構函式的 this 傳進去,並執行該建構函式 4 返回新物件 如果建構函式返回的是乙個物件,則返回該物件 否則 若沒有返回值或者返回基本型別 返回第一步中新建立的物件 var person function name person...