You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
function newF(obj) {
const o = {},
args = [].slice.call(arguments);
o.__ptoto__ = obj.prototype;
const res = obj.apply(o, args.slice(1));
return typeof res === 'object' ? res : o
}
functioncustomNew(fn){constobj={};returnfunction(...args){constres=fn.apply(obj,args);obj.__proto__=Object.getPrototypeOf(fn);returntypeofres==="object" ? res : obj}}functionFoo(name){this.name=name}console.log(customNew(Foo)(2));
function objectFactory(){
var obj=new Object();//创建一个新对象
var Constructor=[].shift.call(arguments);//取得该方法的第一个参数(并删除第一个参数),该参数是构造函数
obj.proto=Constructor.prototype;//将新对象的内部属性__proto__指向构造函数的原型,这样新对象就可以访问原型中的属性和方法
Constructor.apply(obj,arguments);//使用apply,将构造函数中的this指向新对象,这样新对象就可以访问构造函数中的属性和方法
return obj;//返回一个对象
}
function A () {
this.a = 1;
}
A.b = 2;
A.prototype.c = 3;
let a = new A();
// 模仿 new A
function newA () {
let _this = Object.create(A.prototype);
A.call(_this);
return _this;
}
console.log(newA() instanceof A);
Activity
AnsonZnl commentedon May 8, 2019
new 的理解
new步骤
模拟new操作前,要先知道new操作是发生了什么,就拿
new Object()
举例:构造函数:
先准备一个构造函数来
new
使用。原生new:
模拟new
模拟的
new
暂称为newNew
(囡..囡 哈哈~)使用:
newNew(constructor, arg1, arg2, ..)
第0个参数传入构造函数,1~n个参数是构造函数的形参。使用上面的构造函数试一下:
得到和new 一样的答案,说明模拟成功。
你也可以F12 打开控制台试一试。
以上参考:
BeADre commentedon May 8, 2019
function _new(Fn, ...arg) {
const obj = Object.create(Fn.prototype);
const obj1 = Fn.apply(obj, arg);
return obj1 instanceof Object ? obj1 : obj;
}
之前在github看另外一个人写的
tzjoke commentedon May 29, 2019
myprelude commentedon Jun 13, 2019
bWhirring commentedon Jul 9, 2019
Vi-jay commentedon Jul 29, 2019
NARUTOne commentedon Oct 11, 2019
参考 https://juejin.im/post/5bde7c926fb9a049f66b8b52#heading-5
laixihong commentedon Dec 20, 2019
0x3c commentedon Feb 21, 2020
new 操作会执行以下几步:
adi0754 commentedon Jun 8, 2020
blueRoach commentedon Jun 10, 2020
对一个实例new做了以下4件事
实现方法,楼上大佬的
qiqingfu commentedon Jun 15, 2020
推荐看 mdn new运算符
276378532 commentedon Aug 20, 2020
smile-2008 commentedon Sep 22, 2020
+1
3 remaining items
zebratt commentedon Jan 19, 2021
overwatch555 commentedon Mar 1, 2021
WayneGongCN commentedon Mar 1, 2021
我的理解是这样的:
obj 和 obj1 原则上应该是同一个对象的引用。
obj1 是构造函数返回的值,但是通常我们不会在构造函数中写 return 语句。
所以当构造函数有返回值,且这个返回值是 Object 的实例,就优先返回这个值,否则就默认返回 obj。
378406712 commentedon May 17, 2021
实例化一个对象。
zxcdsaqwe123 commentedon Oct 11, 2021
实例化对象
amikly commentedon Nov 9, 2021
new
运算符创建一个用户定义的对象类型的实例或具有构造函数的内置对象的实例实现
flashyy commentedon Feb 17, 2022
github-cxtan commentedon Feb 18, 2022
创建一个新对象
将构造函数中的this指向该对象
执行构造函数代码(给新对象添加属性和方法)
返回者着新对象
据此,我们初步实现模拟new的objectFactory方法:
function objectFactory(){
var obj=new Object();//创建一个新对象
var Constructor=[].shift.call(arguments);//取得该方法的第一个参数(并删除第一个参数),该参数是构造函数
obj.proto=Constructor.prototype;//将新对象的内部属性__proto__指向构造函数的原型,这样新对象就可以访问原型中的属性和方法
Constructor.apply(obj,arguments);//使用apply,将构造函数中的this指向新对象,这样新对象就可以访问构造函数中的属性和方法
return obj;//返回一个对象
}
ilss commentedon Mar 8, 2022
可以加入一些内存方面的理解
yxllovewq commentedon Mar 9, 2022
new的背后操作:
xiaoqiangz commentedon May 27, 2022
// 1 创建一个空对象
// 2 将新对象的原型指向构造函数的prototype
// 3 将this指向该对象
// 4 返回这个对象
xiaoxiaozhiya commentedon May 31, 2022
Sobrium commentedon Sep 12, 2022
1、对new操作符的理解
创建一个obj空对象,
使obj的__proto__指向构造函数的prototype
修改构造函数的this指向,使构造函数的this指向obj并执行构造函数
返回新创建的obj对象
2、手动实现
function myNew(){
let obj = {},
fn = [].shift.call(arguments);
obj.proto = fn.prototype;
let res = fn.apply(obj, arguments);
return typeof res === 'object' ? res : obj;
}
never123450 commentedon Sep 4, 2023
在JavaScript中,
new
操作符用于创建一个对象实例。当你使用new
关键字调用一个函数时,它会执行以下操作:this
指向新对象)。下面是一个手动实现
new
方法的JavaScript示例:// 使用自定义的myNew方法创建对象实例
const person = myNew(Person, 'John', 25);
console.log(person.name); // 输出: John
console.log(person.age); // 输出: 25
这个自定义的
myNew
方法模拟了new
操作符的行为,它接受构造函数和参数,并返回一个新的对象实例。panpanxuebing commentedon Dec 10, 2024