js对象的构造函数与原型

news/2024/7/5 6:08:34

从__proto__属性说起

我们都知道,javascript创建对象一般有两种方式:

方式一:通过字面量创建,例如:
var obj = {} //创建一个空对象
var obj1 = { name :'js'} //创建带属性的对象

方式二:通过new关键字,如:
//内置构造函数
var numObj = new Number(3) //创建一个number对象

//自定义构造函数
function Myobj (){
	this.name = 'obj'
}
var mObj = new Myobj() 

说明:
通过字面量创建对象,其实是内部隐式的通过new Object()创建,所以从根本上说,所有js对象一般都通过new 构造函数() 的形式创建。

我们把上面的函数在控制台打印,展开后属性如下:
在这里插入图片描述
会发现,每一个对象展开其属性后都会有一个__proto__的属性,这个属性指的就是该对象的原型的引用,你可以通过该属性来查看该对象的构造函数的原型,并能通过该属性增删改该对象原型的属性。

什么是构造函数

和字面意思一样,就是创建该对象的那个函数。

如何查看该对象的构造函数?
在这里插入图片描述
__proto__属性下的constructor属性指的就是该对象的构造函数,既可以查看是哪个函数把这个对象创造出来的。

对象的祖先:原型

原型是所有构造函数中,一个叫prototype属性,他的值类型是一个对象。通过该构造函数创建的对象,都会继承prototype中的属性。
Object.prototype.height = '180cm'
Object.prototype.name = 'i am Object'
var obj = {} 

Number.prototype.name = 'i am Number'
var numObj = new Number(3) 
var numObj1 = new Number(4)


Myobj.prototype.age = 18
function Myobj (){
	this.name = 'obj'
}
var mObj = new Myobj ()
var mObj1 = new Myobj ()

在控制台查看一下属性:
在这里插入图片描述
即使自身没有的属性,只有构造函数的原型上有,对象都会拥有该对象。

原型链

基于上面的代码,在控制台打印如下例子:
在这里插入图片描述
为什么numObj ,numObj1 ,mObj ,mObj1这几个对象也会拥有height属性呢?
以mObj为例,我们在控制台展开其属性:
在这里插入图片描述
发现,所有构造函数的最终的祖先一般都是Object(),所有其实原型会继承Object函数的原型,因此在这种继承关系中形成一种链式的继承关系,这种原型的链式继承结构就是原型链。
当自身没有的属性,会沿着原型链上查找,mobj没有height属性,但是通过原型链,可以从构造函数object的原型上找到,也可以理解成,mobj继承了原型链上的height属性。

另外一种创建对象的方法:Object.creat(对象|null)

Object.create()方法仅能填对象或者null,区别就是:若填入的参数为对象时,创建出来的对象的原型为该参数。若填入的参数是null,创建出来的对象无原型。
var myObj = Object.create({name:'js'})

var nullObj = Object.create(null)

在控制台输出结果:
在这里插入图片描述


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

相关文章

小品: 关于C++引用

此文缘起我看了这篇文章:http://blog.csdn.net/newslxw/archive/2006/08/08/1038972.aspx 还记得当年读书时, 牛牛的C老师告诉我: "引用, 其实就是别名, 与其所引用的对象完全等价". 可是, 我还是有这点疑问: "等价的含义, 是指的什么? 难道是说在最底层的实现…

搞懂Js中的this,call和apply方法

为了更好的看懂这篇文章,建议先要理解js对象的原型和原型链相关的知识,若不了解,可以看上一篇文章《js对象的构造函数与原型》 this的理解 在全局中使用this,this为window对象谁调用了对象中属性,this就是谁this.xxx…

Lua入门系列----pil学习笔记之Getting Start

本文作者:sodme本文出处:http://blog.csdn.net/sodme声明: 本文可以不经作者同意, 任意复制, 转载, 但任何对本文的引用都请保留文章开始前三行的作者, 出处以及声明信息. 谢谢.很多高深的人物都说过类似的话:"语言层面的东西, 都是表面的东西, 最核心的是设计模式, 是算法…

js中hasOwnProperty和instanceof的使用

hasOwnProperty hasOwnProperty方法是用来判断某个属性是否是属于自身对象的,该方法仅用于判断自身对象,不会查找原型链。 案例如下: Person.prototype.name 原型 Person.prototype.myFc function(){}function Person(){this.age 18this.…

Lua入门系列----pil学习笔记之 Type and Values (1)

本文作者:sodme本文出处:http://blog.csdn.net/sodme声明: 本文可以不经作者同意, 任意复制, 转载, 但任何对本文的引用都请保留文章开始前三行的作者, 出处以及声明信息. 谢谢.参考资源:http://www.lua.org/pil/ 一 个小小的脚本语言都能玩出这么多花样来&#xff…

js函数中的形参,实参和arguments对象

形参:形式参数,是函数作用域内的变量。 实参:调用函数时,传入的参数,有对应的形参时,实参会赋值给形参。 案例: var MyF function(a){} //a为形参MyF(1) //1为实参在javascript中的函数中&…

对标号地址的另一种相对寻址方式

汇编程序中, 对数据访问时, 通常是这样的:_asm{...DATA_LABLE:_emit 0x87_emit 0xa0_emit 0x49_emit 0x90...mov ebx, dword ptr [DATA_LABLE]...}其中, 当程序编译之后, mov指令中的DATA_LABLE标号地址会被转成一个绝对地址. 而有时绝对地址这一点可能会对这样一种需求带来障碍…

callee和caller的使用

callee callee是arguments对象中的一个方法,功能是引用arguments所在的函数。 案例: //命名函数 function fn(){console.log(arguments.callee)} fn() 结果如下: //ƒ fn(){console.log(arguments.callee)}//匿名函数 (function(){console.l…