jslang求職シリーズ-11-手書きnew
6132 ワード
ディレクトリ
振り回さない先端は、塩魚とどう違いますか?
目次
ディレクトリ
二言前言
三原生new
四手書きnew
4.1簡単実現;
4.2完備バージョン;
二言前言
目次に戻ります
面接官:手書きで
この問題を見たら、慌てないでください.jslangさんはゆっくりとあなたを連れてやります.
まず一つのケースを見ます.
答えは: では、この問題の
三原生new
目次に戻ります
まず原生
目次に戻ります
4.1簡単実現
目次に戻ります
まず簡単に3行のコードでは、最初に空のオブジェクト は次いで は次いで は最後に wow、開豁ではありませんか?簡単な
4.2完備バージョン
目次に戻ります
OKです.簡単版を書きました.複雑版に必要な条件を見てみましょう.の最初のパラメータは、関数である必要があります. プロトタイプチェーン継承. は、 .は、構造関数が 非関数およびオブジェクトは、新たに作成されたオブジェクトを返します.そうでなければ、コンストラクションの 最終的な実現:
jslangの文書庫は
高く険しい山採用
知識共有署名-非商業的使用-同じ方法で4.0国際許諾協議を共有する。は許可を行う.ベース
https://github.com/LiangJunrong/document-library上の作品.本許諾契約の授権以外の使用権限は、
https://creativecommons.org/licenses/by-nc-sa/2.5/cn/で獲得した.
振り回さない先端は、塩魚とどう違いますか?
目次
ディレクトリ
二言前言
三原生new
四手書きnew
4.1簡単実現;
4.2完備バージョン;
二言前言
目次に戻ります
面接官:手書きで
new
を作ってください.この問題を見たら、慌てないでください.jslangさんはゆっくりとあなたを連れてやります.
まず一つのケースを見ます.
this.name = 'jsliang';
let Foo = function() {
this.name = 'zhazhaliang';
}
let foo = new Foo();
console.log(foo.name); // ?
console.log(window.name); // ?
上のコードは何を出力しますか?答えは:
zhazhaliang
jsliang
new
は何をしましたか?私たちは深く研究します.三原生new
目次に戻ります
まず原生
new
の一例を見て、new
に何ができるかを考えてみます.function Person( name, age){
this.name = name;
this.age = age;
// return; // this
// return null; // this
// return this; // this
// return false; // this
// return 'hello world'; // this
// return 2; // this
// return []; // [], person.name = undefined
// return function(){}; // function, this, person.name = undefined
// return new Boolean(false); // boolean, this, person.name = undefined
// return new String('hello world'); // string, this, person.name = undefined
// return new Number(32); // number, this, person.name = undefined
}
var person = new Person("jsliang", 25);
console.log(person); // Person {name: "jsliang", age: 25}
四手書きnew目次に戻ります
new
の内容を理解し始めました.どうやって手書きしたらいいですか?4.1簡単実現
目次に戻ります
まず簡単に3行のコードで
new
を書いてみます.new
を作成する.tempObj = {}
方法を呼び出し、Foo.apply
をtempObj
方法のパラメータとして使用し、apply
の実行コンテキスト作成時には、Foo
はthis
オブジェクトを指す.tempObj
関数を実行し、このときのFoo
関数実行コンテキストのFoo
はthis
オブジェクトを指す.tempObj
オブジェクトを返します.function myNew(func, ...args) {
const tempObj = {};
func.apply(tempObj, args);
return tempObj;
}
this.name = 'jsliang';
let Foo = function(name, age) {
this.name = name;
this.age = age;
}
let foo = myNew(Foo, 'zhazhaliang', 25);
console.log(foo.name); // ?
console.log(foo.age); // ?
console.log(window.name); // ?
上記のように、tempObj
はthis
に属し、tempObj
に結合されていることが分かります.foo
zhazhaliang
25
jsliang
の実現は3行のコードだけが必要です.4.2完備バージョン
目次に戻ります
OKです.簡単版を書きました.複雑版に必要な条件を見てみましょう.
new
ですが、オリジナルのものは作れません.const person = new Person()
になります.const person = myNew(Person)
のobj
は、obj
のプロトタイプ__proto__
、すなわちfunc
を指すオブジェクトを新たに作った.prototype
の指向を修正する.obj.__proto__ === func.prototype
によってthis
とapply
とを結合し、パラメータを配列として伝達する(方法体定義は、残りのパラメータを配列に分解した)obj
またはfunc
に戻るかどうかを判断する.Object
は、Function
がtypeof
を排除する必要があると判断した.object
値を返します.function myNew(func, ...args) {
// 1.
if (typeof func !== 'function') {
throw ' ';
}
// 2.
const obj = {};
// 3. __proto__ func
// (constructor.prototype)
obj.__proto__ = Object.create(func.prototype);
// IE 2 3
// const obj = Object.create(func.prototype);
// 4. apply this
let result = func.apply(obj, args);
// 5. ,
// obj
const isObject = typeof result === 'object' && result !== null;
const isFunction = typeof result === 'function';
return isObject || isFunction ? result : obj;
}
//
function Person(name) {
this.name = name;
return function() { // 5
console.log(' ');
};
}
// 2 3
Person.prototype.sayName = function() {
console.log(`My name is ${this.name}`);
}
const me = myNew(Person, 'jsliang'); // 4
me.sayName(); // My name is jsliang
console.log(me); // Person {name: 'jsliang'}
// 1
// const you = myNew({ name: 'jsliang' }, 'jsliang'); // :
このように、私達はnull
がどんなものかを知っています.手書きtypeof null === object
に触れると、慌てません.jslangの文書庫は
高く険しい山採用
知識共有署名-非商業的使用-同じ方法で4.0国際許諾協議を共有する。は許可を行う.ベース
https://github.com/LiangJunrong/document-library上の作品.本許諾契約の授権以外の使用権限は、
https://creativecommons.org/licenses/by-nc-sa/2.5/cn/で獲得した.