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,我想要创建一个 ...
随机推荐
- 异常信息ASM ClassReader failed to parse class file的问题解决
jdk8与spring 3不兼容问题:用jdk7.或者升级到spring4 详情:异常信息ASM ClassReader failed to parse class file的问题解决
- FDConnection
FDConnection 利用FDConnection获取信息,不用放query控件也可以. FDConnection1.GetTableNames('', '', '', List); FD ...
- Star打印机数据解密
通过串口调试工具 抓取到的16进制文本; 如下 然后打开我们的文档,查看命令数据内容. 详情请密我QQ:1161588342 说明加好友原因
- 11 python shutil 模块
shutil 模块 高级的 文件.文件夹.压缩包 处理模块 1.将文件内容拷贝到另一个文件中 import shutil f1 = open('os_模块.py','r',encoding='ut ...
- 压缩文件tar.gz和zip之间的区别
我们在开发的时候通常要先下载相关的软件或者是源码,或者是jar包.在下载东西的时候总是碰见后缀是.tar.gz和.zip的问题,搞不清楚是怎么回事,不晓得下载哪个文件才是对自己有用的.现在我知道了,其 ...
- vue - iview UI组件的col标签报错 x-invalid-end-tag
https://blog.csdn.net/xiao199306/article/details/80430087
- Elasticsearch之启动(前台和后台)
分为两种情况,取决于是否安装了tomat. 一.若安装了tomcat 1.es的前台启动 需要先启动tomcat,再启动es,否则会报错! 所以,得 2.es的后台启动 [hadoop@HadoopM ...
- mysql的collation-字符集
utf8_general_ci :排序规则 utf8 -- UTF-8 Unicode :字符集 一.通过my.cnf文件增加(一劳永逸)两个参数:1.在[mysq ...
- C#实现支持单点登录的一个存储用户信息的类
网上有很多介绍单点登录的文章,但多为架构设计以及概念性文章,而本文将介绍单点登录的具体具体实现 利用哈希表,作为保存登录用户的队列 private static Hashtable m_ ...
- C语言高级-结构,共用体,文件,链表
C语言结构 标准声明方式 struct student{ int age; char sex; }; 这个可以在main函数中定义: struct student ...