JavaScript原型
来源:互联网 发布:数据恢复软件评测 编辑:程序博客网 时间:2024/05/29 18:02
JavaScript原型
本文主要对JavaScript原型进行分析,详细阐述了构造函数、原型对象以及对象实例三者之间的关系。
构造函数
何为构造函数?构造函数本身是个函数,只不过该函数是出于创建新对象的目的而定义的。通常我们可以使用new操作符后跟一个构造函数来创建一个对象,如下所示:
示例一:function Person(){}var person1 = new Person();person1.name = "Rowling";console.log(person1.name);//Rowling
上述代码中的Person即为一个构造函数(按照惯例,构造函数名始终都应该以一个大写字母开头,构造函数与普通函数的唯一区别在于调用的方式不同),person1就是采用构造函数Person创建的一个对象实例,通过点表示法为person1的name属性赋值。
prototype
我们所创建的每一个函数(当然包括构造函数)都有一个prototype(原型)属性,这个属性是一个指针,指向一个对象,这个对象就是该函数的原型对象,也是通过调用该构造函数所创建的那个对象实例的原型对象。
那么何为原型对象呢?我们可以这么理解:只要创建了一个新函数就会有一个与之关联的原型对象,同时会根据一组特定的规则为该函数创建一个prototype属性指向该原型对象。
示例二:function Person(){}Person.prototype.name = "Rowling";Person.prototype.age = 23;Person.prototype.sayName = function(){ console.log(this.name);}var person2 = new Person();console.log(person2.age);//23
上述代码中的Person.prototype就是Person构造函数的原型对象。原型对象中的信息(属性、方法)可以被通过该构造函数创建的对象实例所共享,这一点在之后分析实例和原型对象的时候会再详细说明。
constuctor
每个对象实例都有constructor属性,指向创建其的构造函数。事实上,在创建了构造函数之后,其原型对象默认只会自动取得一个constructor属性,该属性是一个指向该构造函数。即在上述例子中Person.prototype.constructor指向Person。并且该属性也是共享的,所以可以通过对象实例访问,这也就是为何Object的每个实例都有constructor属性的原因。所以根据上述代码会有如下结果:
alert(person1.constructor == Person);//truealert(person2.constructor == Person);//true
因此我们可以得出结论,对象实例的constructor属性其实是来自于其原型(如果不在实例中创建的话)。
__proto__
当调用构造函数创建一个新实例后,该实例的内部会自动包含一个指针指向构造函数的原型对象,该指针即为__proto__。在这里需要强调一下,这个指向关联只存在于对象实例和原型对象之间,而不是存在于实例与构造函数之间。
console.log(person2.__proto__ === Person.prototype);//true
至于构造函数和对象实例,它们之间并没有什么指向关系,对象实例只是通过调用构造函数而生成(new 发方式),而调用构造函数也可创建出很多对象实例。
综上,我们可以用下面一张图来表示构造函数、原型对象以及实例对象之间的关系:
- JavaScript原型,原型链
- JavaScript-原型、原型链
- JavaScript原型,原型链
- JavaScript-原型、原型链
- JavaScript 原型
- JavaScript原型
- javascript原型
- Javascript原型
- javascript原型
- JAVASCRIPT原型
- javascript原型
- Javascript原型
- javascript原型
- JavaScript 原型
- 【JavaScript】--原型
- JavaScript 原型
- JavaScript原型
- javascript原型
- 使用Python的SymPy库解决数学运算问题
- cuda矩阵之心得
- 【拉格朗日求自然数幂和】cf622F
- springboot—restful风格
- Linux 之内核态与用户态
- JavaScript原型
- CTF中的编码与加密题
- 动态规划5:找零钱问题
- 简单的c++垃圾回收器
- Java基础——可变参数
- MVC5学习小记(2)
- JSP标准标签库
- Unity Render Pipeline 渲染管线(漫画)
- 运行eclipse总是弹出错误