js new运算符的本质


思路:

1️⃣new运算符后边跟一个函数,返回一个对象,这个对象可以访问这个函数的原型
2️⃣new后边的函数this指向这个返回的对象

两个辅助函数

Function.prototype.method = function (name, func) {
    this.prototype[name] = func;
    return this;
}
Object.create = function (o) {
    var F = function () { };
    F.prototype = o;
    return new F();
}

第一步可以通过create方法创建一个对象继承这个函数的原型。
第二步可通过apply把函数内部的this指向这个创建的对象

如果new运算符是一个方法而不是一个运算符,它可能会像这样执行:

 Function.method('new', function () {
 	//创建一个新对象,它继承自构造函数的原型对象。
     var that = Object.create(this.prototype);
     /* 在下边例子中this指的是Mammal函数 此时的that有了this的原型get_name和say方法 */
 	//调用构造函数,绑定到this这个新对象上
     var other = this.apply(that, arguments);
     /* 在下边的例子中相当于是执行了that.Mammal('Herb the Mammal') 此时的that有了name属性 */
     return  that;
 })

测试

定义一个构造器并扩充它的原型:

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

Mammal.prototype.get_name = function(){
    return this.name;
}

Mammal.prototype.say  = function(){
    return this.saying || ''
};

调用new

var myMammal = Mammal.new('Herb the Mammal')
var name = myMammal.get_name()
console.log(myMammal, name, '-----')



完整代码

Function.prototype.method = function (name, func) {
 this.prototype[name] = func;
    return this;
}
Object.create = function (o) {
    var F = function () { };
    F.prototype = o;
    return new F();
}

Function.method('new', function () {
    var that = Object.create(this.prototype);

    var other = this.apply(that, arguments);

    return (typeof other === 'object' && other) || that;
})

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

Mammal.prototype.get_name = function(){
    return this.name;
}

Mammal.prototype.say  = function(){
    return this.saying || ''
};

var myMammal = Mammal.new('Herb the Mammal')
var name = myMammal.get_name()
console.log(myMammal, name, '-----')
全部评论

相关推荐

2025-11-27 21:29
已编辑
武汉理工大学 Java
点赞 评论 收藏
分享
StephenZ_:我9月份找的第一段实习也是遇到这种骗子公司了,问他后端有多少人和我说7个正职,进去一看只有一个后端剩下的都是产品前端算法(没错甚至还有算法)。还是某制造业中大厂,我离职的时候还阴阳怪气我
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务