这篇“JavaScript中从原型到原型链的示例分析”除了程序员外大部分人都不太理解,今天小编为了让大家更加理解“JavaScript中从原型到原型链的示例分析”,给大家总结了以下内容,具有一定借鉴价值,内容详细步骤清晰,细节处理妥当,希望大家通过这篇文章有所收获、下面让我们一起来看看具体内容吧。
<强>一、构造函数强>
<编辑> 1.1什么是构造函数? 编辑>构造函数本身就是一个函数,与普通函数没有任何区别,不过<强>为了规范一般将其首字母大写>强。构造函数和普通函数的区别在于,使用新<强> 强>生成实例的函数就是构造函数,直接调用的就是普通函数。
function 人(),{ this.name = 'yuguang';};var person = new Person();console.log(person.name) // yuguang
在这个例子中,Person 就是一个构造函数。
1.2 constructor?
constructor
返回创建实例对象时构造函数的引用。此属性的值是对函数本身的引用,而不是一个包含函数名称的字符串。
可以看到实例对象的constructor指向了它的构造函数,而它和原型的关系我们在之后会链接到一起。
1.3 都有哪些数据类型或者函数拥有constructor
呢?
在JavaScript中,每个具有原型的对象都会自动获得constructor属性。除了:arguments
、Enumerator
、Error
、Global
、Math
、RegExp
等一些特殊对象之外,其他所有的JavaScript内置对象都具备constructor属性。例如:Array
、Boolean
、Date
、Function
、Number
、Object
、String
等。所有主流浏览器均支持该属性。打开控制台我们可以验证一下
// 字符串console.log('str'.constructor) // ? String() { [native code] }console.log('str'.constructor === String) // true// 数组console.log([1,2,3].constructor) // ? Array() { [native code] }console.log([1,2,3].constructor === Array) // true// 数字var num = 1console.log(num.constructor) // ? Number() { [native code] }console.log(num.constructor === Number) // true// Dateconsole.log(new Date().constructor) // ? Date() { [native code] }// 注意!!!不要混淆哦console.log(new Date().getTime().constructor) // ? Number() { [native code] }// Booleanconsole.log(true.constructor) // ? Boolean() { [native code] }console.log(true.constructor === Boolean) // true// 自定义函数function show(){ console.log(& # 39;光# 39;);};console.log (show.constructor),//, ?,函数(),{,[native 代码]}//,自定义构造函数,无返回值function 人(){ 时间=this.name 名称;};var p =, new 人()console.log (p.constructor),//, ?,人()//,有返回值function 人(){ this.name =,名称; return { 名称:,& # 39;光# 39; }};var p =,人()console.log (p1.constructor),//, ?,对象(),{,[native 代码]}<编辑> 1.4模拟实现一个新的编辑>
既然构造函数与普通函数的区别仅仅在于调用方式上,我们就应该了新的解。
- <李>
当调用<代码> 代码>新运算符时,该函数总会返回一个对象,
李> <李>通常情况下,构造器里的这就指向返回的这个对象,
李>代码如下:
通常情况下var MyClass =,函数(){ 时间=this.name & # 39;光# 39;;};var obj =, new MyClass (); obj.name;,//,光特殊情况var MyClass =,函数(){ 时间=this.name & # 39;光# 39;; return { 名称:,& # 39;老王& # 39; }};var obj =, new MyClass (); obj.name //,老王
我们利用<代码> __proto__> 代码(隐式原型,下文会提到)属性来模拟一下新调用构造函数的过程:
var objectNew =,函数(){ ,,,//,从object.prototype上克隆一个空的对象 ,,,var obj =, new 对象();, ,,,//,取得外部传入的构造器,这里是人 ,,,var Constructor =, [] .shift.call (, arguments ); ,,,//,更新,指向正确的原型 ,,,obj.__proto__ =, Constructor.prototype;,//知识点,要考,要考,要考, ,,,//,借用外部传入的构造器给obj设置属性 ,,,var ret =, Constructor.apply (obj,参数); ,,,//,确保构造器总是返回一个对象 ,,,return typeof ref ===, & # 39;对象# 39;,?,ret :, obj;}JavaScript中从原型到原型链的示例分析