小编给大家分享一下JavaScript的详细分析示例,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获、下面让我们一起去了解一下吧!
一、操作符新
在讲解它之前我们首先需要澄清一个非常常见的关于JavaScript中函数和对象的误解:
在传统的面向类的语言中,“构造函数”是类中的一些特殊方法,使用新<代码> 代码>初始化类时会调用类中的构造函数。通常的形式是这样的:
=new MyClass (. .);
JavaScript也有一个新的<代码> 代码>操作符,使用方法看起来也和那些面向类的语言一样,绝大多数开发者都认为JavaScript中新的<代码> 代码>的机制也和那些语言一样。然而,JavaScript中新的<代码> 代码>的机制实际上和面向类的语言完全不同。
首先我们重新定义一下JavaScript中的“构造函数”,在JavaScript中,构造函数只是一些使用<代码> 代码>新操作符时被调用的函数。它们并不会属于某个类,也不会实例化一个类。实际上,它们甚至都不能说是一种特殊的函数类型,它们只是被新<代码> 代码>操作符调用的普通函数而已。
实际上并不存在所谓的“构造函数”,只有对于函数的“构造调用”。 使用新<代码> 代码>来调用函数,或者说发生构造函数调用时,会自动执行下面的操作:
- <李>创建(或者说构造)一个全新的对象,李> <李>这个新对象会被执行[[原型]]连接;李> <李>这个新对象会绑定到函数调用的;李> <李>如果函数没有返回其他对象,那么新表达式中的函数调用会自动返回这个新对象。李>
因此,如果我们要想写出一个合乎理论的新代码> <代码>,就必须严格按照上面的步骤,落实到代码上就是:
/* * * @param {fn}函数(任何)构造函数 * @param {__arg1、最长,……}指定的参数列表 */函数myNew (fn…args) {//创建一个新对象,并把它的原型链(__proto__)指向构造函数的原型对象 const实例=Object.create (fn.prototype)//把新对象作为thisArgs和参数列表一起使用电话或申请调用构造函数 const结果=fn。应用(例如,args) 如果构造函数的执行结果返回了对象类型的数据(排除零),则返回该对象,否则返新对象 返回的结果,,===& # 39;typeof实例对象# 39;)?结果:实例 }
示例代码中,我们使用<代码> Object.create (fn.prototype) 代码>创建空对象,使其的原型链<代码> __proto__> 代码指向构造函数的原型对象<代码> fn.prototype> 代码,后面我们也会自己手写一个<代码> Object.create() 代码>方法搞清楚它是如何做到的。
引用>二,操作符运算符
在相当长的一段时间里,JavaScript只有一些近似类的语法元素,如新<代码> 代码>和<代码>运算符> 代码,不过在后来的ES6中新增了一些元素,比如类<代码> 代码>关键字。
在不考虑<代码>类> 代码的前提下,新<代码> 代码>和<代码>运算符代码>之间的关系“暧昧不清”。之所以会出现新<代码> 代码>和<代码>运算符代码>这些操作符,其主要目的就是为了向“面向对象编程”靠拢。
因此,我们既然搞懂了<代码> 代码>,就没有理由不去搞清楚<代码>运算符> 代码。引用MDN上对于<代码>运算符> 代码的描述:“<代码>运算符代码>运算符用于检测构造函数的<代码> 代码>属原型性是否出现在某个实例对象的原型链上”。
看到这里,基本上明白了,<代码>运算符> 代码的实现需要考验你对原型链和<代码> 代码>原型的理解。在JavaScript中关于原型和原型链的内容需要大篇幅的内容才能讲述得清楚,而网上也有一些不错的总结博文,其中帮你彻底搞懂JS中的原型,__proto__与构造函数(图解)就是一篇难得的精品文章,通透得梳理并总结了它们之间的关系和联系。
《你不知道的JavaScript上卷》第二部分-第5章则更基础,更全面地得介绍了原型相关的内容,值得一读。
引用>以下<代码>运算符代码>代码的实现,虽然很简单,但是需要建立在你对原型和原型链有所了解的基础之上,建议你先把以上的博文或文章看懂了再继续。
/* * * @param{左}对象实例对象 * @param{右}函数构造函数 */函数myInstanceof(左、右){//保证运算符右侧是一个构造函数 如果(typeof没错!==& # 39;函数# 39;){ 把新的错误(& # 39;运算符右侧必须是一个构造函数& # 39;) 返回 }//如果运算符左侧是一个零或者基本数据类型的值,直接返回错误的 如果(左===null | | ![& # 39;函数# 39;& # 39;对象# 39;]。包括(typeof左)){ 返回假 }//只要该构造函数的原型对象出现在实例对象的原型链上,则返回真,否则返回错误的 让原型=Object.getPrototypeOf(左) 而(真){//遍历完了目标对象的原型链都没找到那就是没有,即到了Object.prototype 如果(原型===null)返回false//找到了 如果(原型===right.prototype)返回true//沿着原型链继续向上找 原型=Object.getPrototypeOf(原型) } }JavaScript的详细分析示例