JavaScript中的 prototype 和 constructor
prototype属性
任何js函数都可以用作构造函数, 而构造函数需要用到prototype属性, 因此, 每个js函数F(除了ES5的Function.bind()方法返回的函数外) 都自动拥有一个prototype属性.
F.prototype的值是一个对象 o , o 默认包含唯一一个不可枚举的属性: constructor , 值默认指回 F,可以修改.
调用 F 构造的对象继承 F.prototype 对象.
F.prototype 是类的唯一标识. 当且仅当两个对象继承自同一个原型对象时, 它们才属于同一个类的实例. 而构造函数只是对象创建好之后, 当成是该对象的方法立即调用一次.不能作为类的标识. 如果两个构造函数的prototype属性指向同一个原型对象, 则它们创建的实例属于同一个类.
function C1(){
this.y = ;
}
function C2(){
this.y = ;
}
var p = {x:};
C1.prototype = p;
C2.prototype = p;
var c1 = new C1();
var c2 = new C2();
console.log(c1 instanceof C2); //"true"
console.log(c2 instanceof C1); //"true"
instanceof 运算符检测对象是否属于某个类(名字和构造函数 F 同名)时, 实际上是检查是否继承自 F.prototype. c1 instanceof C1; // 如果 c1 继承自 C1.prototype, 则返回true, 而不是检查c1是否由C1()初始化而来. 而instanceof运算符则强化了构造函数是类的公有标识的概念.
js基于原型的继承机制是动态的,创建对象后, 原型的属性发生改变, 也会影响到继承这个原型的所有实例对象.而且也可以修改内置类的原型对象.
constructor属性
F.prototype.constructor 的值为一个函数对象, 默认指向 F 本身.
构造函数 F 是类的 "公共标识", constructor属性被对象继承下去了, 所以 var obj = new F() 后 obj.constructor 就能找到其构造函数, 也可以说找到了类. 但是修改了 F.prototype 之后, constructor属性也可能改变了, 可以手动修改回来.
二者的关系
var F = function(){};
var p = F.prototype;
var c = p.constructor;
console.log(c === F); // "true"
var F = function(){
};
var G = function(){
console.log("I am G");
};
F.prototype.constructor = G;
var o = new F();
console.log(o.constructor === G); //constructor 属性说明是G, 返回: true
console.log(o.constructor === F); // constructor 属性说明类的构造函数, 现在已经变为G了. 所以: false
console.log(o instanceof F); // o 继承自 F.prototype, 所以是: true
console.log(o instanceof G); // o 不是继承自 G.prototype, 所以是 false
参考: <<JavaScript权威指南: 第6版>>
-->
JavaScript中的 prototype 和 constructor的更多相关文章
- javascript中的prototype和constructor
构造函数 我们知道,ECMAScript5中的Object.Array.Date.RegExp.Function等引用类型都是基于构造函数的,他们本身就是ECMAScript5原生的构造函数.比如,我 ...
- 谈谈javascript中的prototype与继承
谈谈javascript中的prototype与继承 今天想谈谈javascript中的prototype. 通常来说,javascript中的对象就是一个指向prototype的指针和一个自身的属性 ...
- JavaScript中的prototype和__proto__细致解析
最近在学js,体会了一点点它的灵活性.对于初学者的我,总是被它的灵活感到晕头转向,最近发现了一点东西想与大家分享. JavaScript中的prototype和_proto_: 我们先了解一点js中的 ...
- JavaScript中Object.prototype.toString方法的原理
在JavaScript中,想要判断某个对象值属于哪种内置类型,最靠谱的做法就是通过Object.prototype.toString方法. ? 1 2 var arr = []; console.lo ...
- 深入理解Javascript中this, prototype, constructor
在Javascript面向对象编程中经常需要使用到this,prototype和constructor这3个关键字. 1.首先介绍一下this的使用:this表示当前对象;如果在全局中使用this,则 ...
- Javascript中的prototype与继承
通常来说,javascript中的对象就是一个指向prototype的指针和一个自身的属性列表.javascript创建对象时采用了写时复制的理念. 只有构造器才具有prototype属性,原型链继承 ...
- Javascript中的Prototype到底是什么
Javascript也是面向对象的语言,但它是一种基于原型Prototype的语言,而不是基于类的语言.在Javascript中,类和对象看起来没有太多的区别. 什么是prototype: funct ...
- Javascript中的Prototype到底是啥
Javascript也是面向对象的语言,但它是一种基于原型Prototype的语言,而不是基于类的语言.在Javascript中,类和对象看起来没有太多的区别. 通常,这样创建一个对象: functi ...
- JavaScript——中的prototype(原型)
JS中的prototype是JS中比较难理解的一个部分 本文基于下面几个知识点: 1 原型法设计模式 在.Net中可以使用clone()来实现原型法 原型法的主要思想是,现在有1个类A,我想要创建一个 ...
随机推荐
- spring boot 自定义异常
1.创建一个异常: public class LdapQueryException extends Exception { private Integer code; private String m ...
- 4. mybatis实战教程(mybatis in action)之四:实现关联数据的查询
转自:https://www.cnblogs.com/shanheyongmu/p/5653599.html 有了前面几章的基础,对一些简单的应用是可以处理的,但在实际项目中,经常是关联表的查询,比如 ...
- Datetime 24小时制
24小时制: DateTime dt = DateTime.Now; string dt24 = dt.ToString("yyyy-MM-dd HH:mm:ss"); 12小时制 ...
- H5特性回顾
canvas 绘画, video 媒介回放 audio元素 对本地离线存储的更好支持, 新的特殊内容 - 元素 比如 article,footer,header,nav,section, 新的表单控件 ...
- 使用Jena执行SPARQL的Select和Ask查询
使用Jena执行SPARQL的Select和ask查询 提供基本的接口和实现类,可在其他代码中直接调用 Select查询 接口 /** * The interface Select dao. * 本体 ...
- 提交给mysql java驱动的优化下个版本要发布了^_^
Unsubscribe from updates to this bug at: https://bugs.mysql.com/77681 Updated by: Daniel che chung S ...
- java 可伸缩阻塞队列实现
最近一年多写的最虐心的代码.必须好好复习java并发了.搞了一晚上终于测试都跑通过了,特此纪念,以资鼓励! import java.util.ArrayList; import java.util.L ...
- Dotfuscator Professional Edition获取代码发布和混淆代码
1 Dotfuscator Professional Edition 4.9 破解版 下载地址:http://www.pc0359.cn/downinfo/39815.html 备份地址:C:\D\9 ...
- 输入N组父子对,求父子对所组成的二叉树的高度----17年某公司的笔试题
题目的大致意思如下: 输入N组数,一组数代表一个父子对(如,0 1,0代表父节点,1代表子节点),求这N组数所组成的二叉树的高度: 例如: 输入:6 0 1 0 2 1 3 1 4 2 5 ...
- python 刷题必备
1.判断输入的数字是否是回文数: 学习内容:把数字转成字符串 1. def is_palindrome(n): n=str(n) m=n[::-1] return n==m 2. tmp_str = ...