家人问你还没有对象怎么办?那你new一个对象呀

news/2024/7/19 15:26:36 标签: javascript, object, js, 前端, es6

📒博客首页:酸狗的博客🍋
🎉欢迎关注🔎点赞👍收藏⭐️留言📝
💖热爱前端学习,期待一起交流!✨
🙏作者水平很有限,如果发现错误,求告知,多谢!🌈
😎有问题可私信我交流🙄

💘new一个对象

  • 🤔万物皆对象
  • 🤣New一个对象
  • ✨new 操作符具体干了什么呢?
  • 🌈call() 和 apply() 的含义和区别?
    • 🎉call实现不传对象
    • 🎈apply 传递参数

🤔万物皆对象

在这里插入图片描述

在JavaScript的世界,万物皆对象。除了null和undefined,其他基本类型数字,字符串和布尔值都有对应有包装对象。对象的一个特征是你可以在它身上直接调用方法。对于数字基本类型,当试图在其身上调用toString方法会失败,但用括号括起来后再调用就不会失败了,内部实现是用相应的包装对象将基本类型转为对象。所以(1).toString()相当于new Number(1).toString()。因此,你的确可以把基本类型数字,字符串,布尔等当对象使用的,只是注意语法要得体。

同时我们注意到,JavaScript中数字是不分浮点和整形的,所有数字其实均是浮点类型,只是把小数点省略了而以,比如你看到的1可以写成1.,这也就是为什么当你试图1.toString()时会报错,所以正确的写法应该是这样:1…toString(),或者如上面所述加上括号,这里括号的作用是纠正JS解析器,不要把1后面的点当成小数点。内部实现如上面所述,是将1.用包装对象转成对象再调用方法。

使用new则是将之当做构造函数来调用,会创建一个该类的实例对象,这个对象的type是这个函数名,中间使用this.propertyname=value会对该实例对象的属性赋值,并且无论有没有return,都会返回这个对象。

而如果是直接调用就是简单执行里面的代码,不会创建实例对象,this指向的调用环境下的this对象,如果是在全局中直接调用,就是window,没有默认返回值。

想要创建类,一般用前者(构造器模式),当然也可以使用后者,例如工厂模式和寄生构造器模式。

构造器模式:

javascript">function Person(name, age, job) {
		this.name = name;
		this.age = age;
		this.job = job;
		this.introduce = function() {
			alert("My name is " + this.name + ", I am" + age + "year(s) old, I am a " + job + ".");
		}
	}

工厂模式:

javascript">function createPerson(name, age, job) {
		var o = new Object();
		o.name = name;
		o.age = age;
		o.job = job;
		return o;
}

寄生构造器模式:

javascript">function SpecialArray() {
		var values = new Array();
		values.push.apply(values, arguments);
		values.toPipedString = function() {
			return this.join("|");
		};
		return values;
	}

后两种方法的缺点在于因为返回的还是object类型,所以不能通过instanceof来检测实际类型。

🤣New一个对象

xdm,家里人催你找对象了吗?
不要慌,身为程序员怎么能怕没对象?
没对象怎么办?new一个对象不就解决了吗?😍在这里插入图片描述

javascript">const obj = new Object;

✨new 操作符具体干了什么呢?

new操作符会做以下操作:

  1. 创建一个空的简单Javascript对象 (即{});

  2. 链接该对象(即设置该对象的构造函数)到另一个对象;

  3. 将步骤1新创建的对象作为this的上下文;

  4. 如果该函数没有返回对象,则返回this;

参考:MDN的new解释

🌈call() 和 apply() 的含义和区别?

首先说明两个方法的含义:

call:

  • 调用一个对象的一个方法,用另一个对象替换当前对象。例如:B. call(A, args1, args2); 即 A 对象调用 B 对象的方法。

apply:

  • 调用一个对象的一个方法,用另一个对象替换当前对象。例如:B. apply(A, arguments); 即 A 对象应用 B 对象的方法。

call 与 apply 的相同点:

  • 方法的含义是一样的,即方法功能是一样的;
  • 第一个参数的作用是一样的;

call 与 apply 的不同点:

  • 两者传入的列表形式不一样,call 可以传入多个参数;
    apply 只能传入两个参数,所以其第二个参数往往是作为数组形式传入

xdm,想一想哪个性能更好一些呢🤔?

在这里插入图片描述

🎉call实现不传对象

javascript">function myNew(fn) {
    // 以构造函数fn的prototype为原型 创建一个新的简单对象
    let o = Object.create(fn.prototype)
    // 改变fn的this指向到o,并执行fn
    let k = fn.call(o);
 
    // 如果构造函数没有返回对象,则返回o
    if (typeof k === 'object') {
        return k;
    } else {
        return o;
    }      
}

🎈apply 传递参数

javascript">function myNew(fn, ...args) {
    // 以构造函数fn的prototype为原型 创建一个新的简单对象
    let o = Object.create(fn.prototype)
    // 改变fn的this指向到o,并执行fn
    let k = fn.apply(o, args);
 
    // 如果构造函数没有返回对象,则返回o
    if (typeof k === 'object') {
        return k;
    } else {
        return o;
    }       
}

你现在可以说你有对象了😀
在这里插入图片描述


http://www.niftyadmin.cn/n/805817.html

相关文章

【Redis实现系列】持久化RDB实现

RDB RDB持久化既可以手动执行,也可以根据服务器配置选项定期执行,该功能可以将某个时间点上的数据库状态保存到一个RDB文件中。 RDB持久化功能所生成的RDB文件是一个经过压缩的二进制文件,通过该文件可以还原生成RDB文件时的数据库状态。 …

ssh自动输入密码登录服务器/ssh免输入密码登录/非交互ssh 密码验证

方法一、通过密钥验证(通过方法一的密钥验证就安全了许多,配置也简单,而且同时ssh、scp、sftp等登录都免去了输入密码的麻烦,推荐使用。下面的方法二密码匙明文传送,安全性不高。) 1.生成密匙对&#xff0c…

建立开发编程机制 (转)

建立开发编程机制 (转)[more]建立编程机制 对于系统而言,机制就是系统设计的程序;对于单个问题而言,机制就是解决问题的方法摸板。本文以实例来说明机制是如何建立和运作的。(机制也可以称为模式,不过机制略多带一些管…

为什么需要 WebSocket协议?

📒博客首页:酸狗的博客🍋 🎉欢迎关注🔎点赞👍收藏⭐️留言📝 💖热爱前端学习,期待一起交流!✨ 🙏作者水平很有限,如果发现错误&#x…

IP地址 学习

IP地址分为A,B,C,D,E五类。 网络号:用于识别主机所在的网络;主机号:用于识别该网络中的主机。 其中A类分配给政府机关使用,B类地址给大中型企业使用,C类地址给个人使用。这三种是主要的。 IP地址分为五类&#xff0…

【Redis实现系列】持久化AOF实现

AOF 除了RDB持久化功能之外,Redis还提供了AOF(Append Only File)持久化功能。 被写入AOF文件的所有命令都是以Redis的命令请求协议格式保存的,因为Redis的命令请求协议是纯文本格式。 示例 redis> SET msg "hello"…

nginx 基础知识学习

正向代理,也就是传说中的代理,他的工作原理就像一个跳板。简单的说,我是一个用户,我访问不了某网站,但是我能访问一个代理服务器,这个代理服务器呢,他能访问那个我不能访问的网站,于是我先连上代理服务器,告诉他我需要那个无法访问网站的内容,代理服务器去取回来,然后返回给我。…

改变this指向的call、apply、bind方法

📒博客首页:酸狗的博客🍋 🎉欢迎关注🔎点赞👍收藏⭐️留言📝 💖热爱前端学习,期待一起交流!✨ 🙏作者水平很有限,如果发现错误&#x…