首页 > 专栏 > 前端 > 文章详情
js构造函数中 new 一个对象的解释 发布于:2021-03-07 20:22:57   来源:李小菜   查看:10  讨论:0
理解对象是一些拥有属性和方法的函数,这些对象对于描述逻辑事务非常重要。U6j易塔云建站-模板下载,web开发资源,技术博客
我认为对象就是一个大括号(没有更大的括号了),无需过度抽象化。U6j易塔云建站-模板下载,web开发资源,技术博客
工厂模式(是软件设计领域共知方法):
/**工厂模式**/U6j易塔云建站-模板下载,web开发资源,技术博客
function createPerson(name,age,job){U6j易塔云建站-模板下载,web开发资源,技术博客
    var obj = new Object();U6j易塔云建站-模板下载,web开发资源,技术博客
    obj.name = name;U6j易塔云建站-模板下载,web开发资源,技术博客
    obj.job = job;U6j易塔云建站-模板下载,web开发资源,技术博客
    obj.age = age;U6j易塔云建站-模板下载,web开发资源,技术博客
    obj.sayHey = function(){U6j易塔云建站-模板下载,web开发资源,技术博客
        alert(this.name)U6j易塔云建站-模板下载,web开发资源,技术博客
    };U6j易塔云建站-模板下载,web开发资源,技术博客
    return obj;U6j易塔云建站-模板下载,web开发资源,技术博客
}U6j易塔云建站-模板下载,web开发资源,技术博客
var person1 = createPerson("red",23,"hhh");U6j易塔云建站-模板下载,web开发资源,技术博客
person1.sayHey();U6j易塔云建站-模板下载,web开发资源,技术博客
//调用后会返回一个包含3个属性+一个方法的对象。
/*工厂模式中,不给出this,内部声明,并数据化,需带return返回*/U6j易塔云建站-模板下载,web开发资源,技术博客
function makePlayer(name,totalScore,gamesPlayed){U6j易塔云建站-模板下载,web开发资源,技术博客
    var obj = {};U6j易塔云建站-模板下载,web开发资源,技术博客
    obj.name = name;U6j易塔云建站-模板下载,web开发资源,技术博客
    obj.totalScore = totalScore;U6j易塔云建站-模板下载,web开发资源,技术博客
    obj.gamesPlayed = gamesPlayed;U6j易塔云建站-模板下载,web开发资源,技术博客
    return obj;U6j易塔云建站-模板下载,web开发资源,技术博客
    //不加return 就是普通函数,普通函数没有返回语句U6j易塔云建站-模板下载,web开发资源,技术博客
    //那下面的函数调用,就没结果U6j易塔云建站-模板下载,web开发资源,技术博客
}U6j易塔云建站-模板下载,web开发资源,技术博客
var person = makePlayer("red",90,"yes");U6j易塔云建站-模板下载,web开发资源,技术博客
console.log(person.name);
后来演变为构造函数模式,也就是现在经常用的。
/*构造函数模式U6j易塔云建站-模板下载,web开发资源,技术博客
*   带new操作符U6j易塔云建站-模板下载,web开发资源,技术博客
*   首字母大写U6j易塔云建站-模板下载,web开发资源,技术博客
*   函数内部不带return语句U6j易塔云建站-模板下载,web开发资源,技术博客
*   PS:相对于普通函数,构造函数中的this是指向实例的,而普通函数调用中的this是指向window的。U6j易塔云建站-模板下载,web开发资源,技术博客
*/U6j易塔云建站-模板下载,web开发资源,技术博客
//Object Array,元素构造函数,在运行时会自动出现在执行环境中。U6j易塔云建站-模板下载,web开发资源,技术博客
function Person(name,age,job){U6j易塔云建站-模板下载,web开发资源,技术博客
    this.name = name;U6j易塔云建站-模板下载,web开发资源,技术博客
    this.age = age;U6j易塔云建站-模板下载,web开发资源,技术博客
    this.job = job;U6j易塔云建站-模板下载,web开发资源,技术博客
    this.sayHey = function(){U6j易塔云建站-模板下载,web开发资源,技术博客
        alert("你好,我是:" + this.name + "!")U6j易塔云建站-模板下载,web开发资源,技术博客
    }U6j易塔云建站-模板下载,web开发资源,技术博客
    // console.log(this);U6j易塔云建站-模板下载,web开发资源,技术博客
}U6j易塔云建站-模板下载,web开发资源,技术博客
// console.log(Person);U6j易塔云建站-模板下载,web开发资源,技术博客
var person1 = new Person("red",23,"hhh");
如何理解 new 这个过程?
//new一个对象的过程拆解:U6j易塔云建站-模板下载,web开发资源,技术博客
/*拆解过程分四步:U6j易塔云建站-模板下载,web开发资源,技术博客
*   1,创建一个空对象objU6j易塔云建站-模板下载,web开发资源,技术博客
*   2-1,将这个空对象的 __proto__ 成员指向了构造函数对象的 prototype 成员对象U6j易塔云建站-模板下载,web开发资源,技术博客
*   2-2,将构造函数的作用域赋给空对象,因此构造函数的this指向新对象obj,然后再调用构造函数。U6j易塔云建站-模板下载,web开发资源,技术博客
*   3,执行你的数据操作,工厂模式或对象字面量方式赋值。U6j易塔云建站-模板下载,web开发资源,技术博客
*   4,返回这个对象。U6j易塔云建站-模板下载,web开发资源,技术博客
*/U6j易塔云建站-模板下载,web开发资源,技术博客
//俗称工厂模式拆解U6j易塔云建站-模板下载,web开发资源,技术博客
function anotherObj(){U6j易塔云建站-模板下载,web开发资源,技术博客
    //创建空对象;U6j易塔云建站-模板下载,web开发资源,技术博客
    var otherPerson = {};U6j易塔云建站-模板下载,web开发资源,技术博客
    //将空对象的 __proto__ 指向构造函数的 prototype 成员对象U6j易塔云建站-模板下载,web开发资源,技术博客
    otherPerson.__proto__ = Person.prototype; U6j易塔云建站-模板下载,web开发资源,技术博客
    //延长实例的作用域至构造函数,此时的构造函数this指针,指向着这个实例。新对象也就有了这些属性和方法U6j易塔云建站-模板下载,web开发资源,技术博客
    Person.call(otherPerson);U6j易塔云建站-模板下载,web开发资源,技术博客
    //将otherPerson对象数据 调用 Person构造函数属性和方法 并赋值U6j易塔云建站-模板下载,web开发资源,技术博客
    otherPerson.name = "red";//执行构造函数中的代码U6j易塔云建站-模板下载,web开发资源,技术博客
    otherPerson.age = 23;//这一部分在根据Person构造器中的属性,添加对应实例U6j易塔云建站-模板下载,web开发资源,技术博客
    otherPerson.job = "hhh";//如果你不写sayHey,也会默认添加U6j易塔云建站-模板下载,web开发资源,技术博客
    //就像工厂模式一样,需要返回一个新对象U6j易塔云建站-模板下载,web开发资源,技术博客
    return otherPerson;U6j易塔云建站-模板下载,web开发资源,技术博客
}U6j易塔云建站-模板下载,web开发资源,技术博客
anotherObj();U6j易塔云建站-模板下载,web开发资源,技术博客
//结束U6j易塔云建站-模板下载,web开发资源,技术博客
var person2 = anotherObj();U6j易塔云建站-模板下载,web开发资源,技术博客
console.log(person1);U6j易塔云建站-模板下载,web开发资源,技术博客
// console.log(person2);U6j易塔云建站-模板下载,web开发资源,技术博客
// console.log(person1.constructor == Person);//trueU6j易塔云建站-模板下载,web开发资源,技术博客
// console.log(person2.constructor == Person);//依然是 true
以上是本笔记的精华,最后涉及到一个概念:实例的__proto__ 是 何时或怎么又为何 指向 构造函数的 prototype ,后期继续为大家分享学习成果。

评论

  • 匿名