js---12对象创建方式,构造器,原型
<script type="text/javascript">
var o = {};
var o1 = new Object();//这2种方式创建对象是一样的,因为对象都有默认属性constructor构造器,函数也是对象,js一切都是对象,函数也有构造器函数也是对象,构造器是对象的。
o.constructor 的构造器为 function Object();
o1.constructor 的构造器为 function Object();
o.constructor === o1.constructor //true
Number.constructor 的构造器为 function Function();
function f(){} 的构造器为 function Function()
Function.constructor 为 function Function()
//在构造器层面Function()是最顶级的,只有对象才有构造器
1.constructor //1不存在构造器
var a = 1;
a.constructor 构造器为 function Number() ;// a变量本身是Number构造生成的 typeof 1;//‘number’
typeof true //boolean
var f = function(){}
typeof f //function
var o = {};
o instanceod Object//true var o = {name:"abc"};
var o1 = o.constructor();
o===o1;//false,调用o的构造器不会复制o,而是另外一个对象 //1.{}创建对象
var o = {name:'cc',age:12};
var o2 = o;//o和o2指向同一个对象的引用
//2.工厂函数创建对象
function PersonFactory(pname,page){
return { //返回一个对象
name:pname,
age:page,
headCount:1 //加不加逗号无所谓
};
}
var p1 = PersonFactory("cj",22);
var p2 = PersonFactory("david",33);//不同的对象,js对象也是在堆里面,
//3.函数创建对象
function Person(){ //通过函数创建类,首字母要大写
var age = 30;//函数的私有变量
this.age=22;//通过this给对象加属性
this.name = "cj";
}
var p = new Person();
console.log(p.name);
var p1 = new Person(); Person.prototype.headCount = 1;//类的共同的东西放这里,p和p1里面只有name和age没有headCount,headCount放在共同区域供2个变量使用。
Person.prototype.headCount = 2;//prototype叫原型属性
console.log(p.constructor.prototype.headCount);//2,p对象的构造器指向函数本身,函数本身Person有prototype属性 /*
1.通过var s = {} 创建相同的对象不能够复用,创建差不多的对象需要重新写{}
2.通过工厂函数创建对象,解决了创建相同的对象能够复用,但是没有解决对象成员的复用
3.函数创建对象,解决了对象公有成员的复用
*/
//只有函数才有prototype,prototype是函数的属性,prototype指向一个对象,既然是对象就有constrnctor构造器和函数对象公有的东西,面向对象的思维看待函数。
function f(){}
console.log(f.prototype);
//js没有类,只有模拟了类,
function Person(){
var age = 30;
this.age=22;
this.name = "cj";
}
Person.prototype.headCount = 1;//prototype指向的是一个对象,堆区域,js变量名都是跟java变量名字一样,保存的是地址值。
var p = new Person();
var p1 = new Person();
console.log(p.constructor);//function Person()
console.log(p.constructor.prototype.headCount);//
//用构造器函数创建的对象,跟构造器的原型对象prototype,不是通过constructor构造器建立的,而是通过对象里面的__proto__关联起来的。
console.log(p.headCount);// Person.prototype = {xx:"xx"};//把person的prototype全部改掉
console.log(p.xx);//undefined,因为该的是Person函数类的,只是把函数的prototype重新指向了一个新对象,但是p里面的__proto__仍然指向之前的对象,
console.log(p.headCount);//
var p2 = new Person();
console.log(p2.xx);//"xx",现在自己里面找,找不到就去公有的原型对象里面去找,
p2.xx = "yy";//会在自己对象里面加一个xx属性,值是yy
console.log(Person.prototype.xx);//xx,公有对象prototype里面的xx属性值并没有改变 //总结:函数类才有prototype属性,公有的,__proto__是函数对象有的,都是保存的内存区域的地址,new 函数名()出来的对象,开始__proto__和prototype指向同一块内存区域,

js---12对象创建方式,构造器,原型的更多相关文章
- 第163天:js面向对象-对象创建方式总结
面向对象-对象创建方式总结 1. 创建对象的方式,json方式 推荐使用的场合: 作为函数的参数,临时只用一次的场景.比如设置函数原型对象. var obj = {}; //对象有自己的 属性 和 行 ...
- 【20190220】JavaScript-知识点整理:对象创建方式、原型、闭包
一.对象创建方式 1. 工厂模式 这种模式抽象了创建具体对象的过程,用函数来封装以特定接口创建对象的细节.存在的问题是无法通过 instanceof 识别一个对象的类型. function creat ...
- javascript一种新的对象创建方式-Object.create()
1.Object.create() 是什么? Object.create(proto [, propertiesObject ]) 是E5中提出的一种新的对象创建方式,第一个参数是要继承的原型,如果不 ...
- JS中对象继承方式
JS对象继承方式 摘自<JavaScript的对象继承方式,有几种写法>,作者:peakedness 链接:https://my.oschina.net/u/3970421/blog/28 ...
- 声明对象的方式/构造函数/原型/this指向
函数的发展历程(声明函数的方式): 1.通过Object构造函数或字面量的方式创建单个对象 var obj = new Object; obj.name="新华"; o ...
- 5.对象创建型模式-原型PROTOTYPE
原型:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 原型实现:1.用于创建对象的具体类必须实现clone()操作,用于对象克隆自己以生成新的对象.下面通过原型来实现一个抽象工厂Ma ...
- 设计模式---对象创建模式之原型模式(prototype)
一:概念 原型模式(Prototype Pattern) 实际上就是动态抽取当前对象运行时的状态 Prototype模式是一种对象创建型模式,它采取复制原型对象的方法来创建对象的实例.使用Protot ...
- js判断对象的属性是原型的还是实例的
一些情况下,我们需要知道对象的属性是原型的还是实例的,如果看代码的话比较繁琐,下面讲解下如何可以直接判断 1.hasOwnProperty()函数用于指示一个对象自身(不包括原型链)是否具有指定名称的 ...
- 对比js库分枝Jquery和js获取对象的方式
一.Jquery和JS的认识 对于这点不谈详细,但能有一个能有一个全面的印象,Jquery本质上也是JS,只不过用一句话概括就是 “write letter and do more”,写的更少,做 ...
随机推荐
- CSS的flex布局和Grid布局
一.什么是 flex 布局 2009年,W3C 提出了一种新的方案----Flex 布局,可以简便.完整.响应式地实现各种页面布局.目前,它已经得到了所有浏览器的支持,这意味着,现在就能很安全地使用这 ...
- d3碰撞源码分析
技术 d3. d3.force.d3.geom.quadtree. d3.geom.quadtree 四叉树的应用:图像处理.空间数据索引.2D中的快速碰撞检测.存储稀疏数据等,游戏编程. 上图中的数 ...
- BZOJ 3787 Gty的文艺妹子序列(分块+树状数组+前缀和)
题意 给出n个数,要求支持单点修改和区间逆序对,强制在线. n,m<=50000 题解 和不带修改差不多,预处理出smaller[i][j]代表前i块小于j的数的数量,但不能用f[i][j]代表 ...
- 首家5G体验厅在深圳建成
日前,深圳移动卓越时代营业厅推出5G全方位体验活动,让市民亲身感受5G时代到来.据悉,十大5G展示项目生动展现移动5G带来的生活巨变与产业升级,为5G发展汇聚各界力量加速创新落地. 现场有市民表示,5 ...
- 外媒分析:iPhone销量低于预期是中国市场疲软影响的
根据外媒AppleInsider的报道,来自摩根士丹利(Morgan Stanley)的Katy Huberty是最新一位下调苹果目标股价的分析师,她在报告中写道,iPhone的销量低于预期,主要是因 ...
- 【redis】redis命令集
参考资料: http://www.cnblogs.com/woshimrf/p/5198361.html
- eclipse maven install 时控制台乱码问题解决
pom.xml文件中加入: <properties> <argLine>-Dfile.encoding=UTF-8</argLine> <project.bu ...
- zookeeper_相关命令 以及 API
(区分大小写) 启动ZooKeeper服务 进入主目录下的 /bin 文件夹. zkServer.sh start. 需要每个节点运行启动命令 客户端启动 zkCli ...
- 自己定义View之Chart图标系列(1)——点阵图
近期要做一些图表类的需求,一開始就去github上看了看,发现开源的图表框架还是蛮多的.可是非常少有全然符合我的需求的.另外就是使用起来比較麻烦.所以就决定自己来造轮子了~~~ 今天要介绍的就是And ...
- atitit.js 与c# java交互html5化的原理与总结.doc
atitit.js 与c# java交互html5化的原理与总结.doc 1. 实现html5化界面的要解决的策略 1 1.1. Js交互 1 1.2. 动态參数个数 1 1.3. 事件监听 2 2. ...