在 JS 中,使用构造函数时要注意以下两点:
new 在执行时会做四件事情:
实例成员和静态成员
// 构造函数中的属性和方法我们称为成员,成员可以添加function Star(uname, age) {this.uname = uname;this.age = age;this.sing = function () {console.log("能唱歌");}}var ldh = new Star("刘德华", 40);// 1. 实例成员就是构造函数内部通过this添加的成员 uname age sing 就是实例成员// 实例成员只能通过实例化的对象来访问console.log(ldh.uname); // 刘德华ldh.sing(); // 能唱歌console.log(Star.uname);// undefined,不可以通过构造函数来访问实例成员// 2. 静态成员:在构造函数本身上添加的成员 sex 就是静态成员Star.sex = "男";// 静态成员只能通过构造函数来访问console.log(Star.sex);// 男console.log(ldh.sex);// undefined,不能通过对象来访问
原型 构造函数原型
// 1. 构造函数的问题. function Star(uname, age) {this.uname = uname;this.age = age;// this.sing = function() {//console.log('我会唱歌');// }}// 在prototype中定义共享的sing方法,一般情况下,我们的公共属性定义到构造函数里面, 公共的方法我们放到原型对象身上Star.prototype.sing = function () {console.log(this.uname + '我会唱歌');}var ldh = new Star('刘德华', 18);var zxy = new Star('张学友', 19);console.log(ldh.sing === zxy.sing);// console.dir(Star);ldh.sing();//刘德华我会唱歌zxy.sing();//张学友我会唱歌
对象原型
function Star(uname, age) {this.uname = uname;this.age = age;}Star.prototype.sing = function () {console.log('我会唱歌');}var ldh = new Star('刘德华', 18);var zxy = new Star('张学友', 19);ldh.sing();console.log(ldh); // 对象身上系统自己添加一个 __proto__ 指向我们构造函数的原型对象 prototypeconsole.log(ldh.__proto__ === Star.prototype);// 方法的查找规则: 首先先看ldh 对象身上是否有 sing 方法,如果有就执行这个对象上的sing// 如果没有sing 这个方法,因为有__proto__ 的存在,就去构造函数原型对象prototype身上去查找sing这个方法
构造函数
function Star(uname, age) {this.uname = uname;this.age = age;}var ldh = new Star('刘德华', 18);var zxy = new Star('张学友', 19);console.log(Star.prototype === ldh.__proto__);// trueconsole.log(Star.prototype.constructor);// ? Star(uname, age) {//this.uname = uname;//this.age = age;// }console.log(Star.prototype.constructor === ldh.__proto__.constructor);// true// 使用原型增加方法// Star.prototype.sing = function () {//console.log("唱歌");// }// Star.prototype.movie = function () {//console.log("电影");// }// 直接对原型赋值Star.prototype = {// 如果我们修改了原来的原型对象,给原型对象赋值的是一个对象,则必须手动的利用constructor指回原来的构造函数constructor: Star,sing: function () {console.log("唱歌");},movie: function () {console.log("电影");}}console.log(Star.prototype.constructor === ldh.__proto__.constructor);// true,不手动利用constructor指回原来的构造函数则为false
构造函数、实例、原型对象三者之间的关系:
原型对象this指向的成员查找机制(规则) 当访问一个对象的属性(包括方法)时,首先查找这个对象自身有没有该属性 。如果没有就查找它的原型(也就是 指向的原型对象) 。如果还没有就查找原型对象的原型(的原型对象) 。依此类推一直找到为止(null) 。对象原型的意义就在于为对象成员查找机制提供一个方向,或者说一条路线 。扩展内置对象
- 【滴滴】职级、薪酬、绩效全认知
- 【腾讯】职级、薪酬、绩效全认知
- 信息学奥赛学习、训练、测试的顺序,思路及方法
- 古代十大酷刑、剥皮、腰斩、车裂、俱五刑、凌迟等
- 万字长文爆肝Python基础入门【第二弹、超详细数据类型总结】
- 学习安卓开发!我凭什么拿到了阿里、腾讯、今日头条3家大厂offer?
- 【百度】职级、薪酬、绩效全认知
- 跳槽面试,外包履历能写在简历上吗?
- 互联网公司员工职级、研发效能度量、OKR与绩效考核
- Mac小技巧:教你如何在Mac电脑打出command?、option?等特殊符号