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_cxf_basic_sender
jar applicationContent.xml <?xml version="1.0" encoding="UTF-8"?> <bean ...
- Laravel基础
一.Laravel核心目录文件介绍 app:程序的核心代码和业务逻辑代码,其中的Http目录是我们业务逻辑的存放点 bootstrap:包含框架启动的和自动加载文件 config:包含所有程序中的配置 ...
- linux时间
1.查看时间:date Thu Mar 2 13:22:54 UTC 2017 2.查看时区:date -R Thu, 02 Mar 2017 13:23:32 +0000 3.Linux时间戳:d ...
- Gson 解析教程
Gson 是google解析Json的一个开源框架,同类的框架fastJson,JackJson等等 本人fastJson用了两年,也是从去年才开始接触Gson,希望下面的总结会对博友有用,至于Gso ...
- 怎么才能将文件流或者图片转化为base64,传到前台展示
图片转化为base64,传到前台展示 public String getBase64(){ String imgStr = ""; try { File file = new Fi ...
- nginx HttpLuaModule
http://wiki.nginx.org/HttpLuaModule#Directives Name ngx_lua - Embed the power of Lua into Nginx This ...
- JSTL标签库学习记录2-fmt
fmt的标签为辅助性功能标签 设置编码 <fmt:requestEncoding value=""> 国际化相关 <fmt:setLocale value=&qu ...
- Java Thread.interrupt interrupted
Java Thread.interrupt @(Base)[JDK, 线程, interrupt] 原文地址,转载请注明 下面这个场景你可能很熟悉,我们调用Thread.sleep(),conditi ...
- Git reset head revert 回滚
Overview 涉及Git一些日常操作 :) 基础知识 <Pro Git>至少了解branch,commit的概念,及基本的原理 Git常用魔法 存档:master代码回滚方法 我是QA ...
- JDBC之使用配置文件链接数据库
写在前面 JDBC以一种统一的方式来对各种各样的数据库进行存取,JDBC为开发人员隐藏了不同数据库的不同特性.程序员开发时,知道要开发访问数据库的应用,于是将一个对应数据库的JDBC驱动程序类的引用进 ...