javascript对象的属性,方法,prototype作用范围分析.
用了javascript这么久由于没有系统学习过基础,总是拿来主义. 所以对一些基础知识还是搞不清楚很混乱. 今天自己做个小例子,希望彻底能搞清楚.
注释中对象只例子的对象本身,原型只原型继承对象的新对象.
1 /**
2 * Created by Feng Huang on 10/10/2015.
3 */
4
5 function Obj(arg){
6 var a = arg; //对象的私有变量 对象和原型都不能访问
7 var fn = function(){}; //对象的私有函数 对象和原型都不能调用
8
9 this.b = arg; //原型的公有变量 原型能访问对象自己不能访问 [这种其实很容易理解出错的. 对象本身竟然不能调用但原型却可以.] 一直以为这种是对象自己也是可以调用的属性
10 this.fn1 = function(){}; //原型的公有函数 原型能调用对象自己不能访问
11 }
12
13 Obj.c = 1; //对象的公有变量 对象能访问原型不能
14 Obj.fn2 = function(){}; //对象的公有函数 对象能调用原型不能
15
16 Obj.prototype.d = 11; //原型的属性 对象本身访问不到
17 Obj.prototype.fn3 = function(){}; //原型的方法 对象本身访问不到
18
19
20 console.log("Obj.a = "+Obj.a);
21 console.log("Obj.fn = "+Obj.fn);
22 console.log("Obj.b = "+ Obj.b);
23 console.log("Obj.fn1 = "+ Obj.fn1);
24 console.log("Obj.c = "+ Obj.c);
25 console.log("Obj.fn2 = "+Obj.fn2);
26 console.log("Obj.d = "+ Obj.d);
27 console.log("Obj.fn3 = "+Obj.fn3);
28
29 console.log("--------------------------------------");
30
31 var A = new Obj(22);
32 console.log("A.a = "+A.a);
33 console.log("A.fn = " +A.fn);
34 console.log("A.b = "+ A.b);
35 console.log("A.fn1 = "+A.fn1);
36 console.log("A.c = "+A.c);
37 console.log("A.fn2 = "+A.fn2);
38 console.log("A.d = "+A.d);
39 console.log("A.fn3 = "+A.fn3);
结果==>
Obj.a = undefined
Obj.fn = undefined
Obj.b = undefined
Obj.fn1 = undefined
Obj.c = 1
Obj.fn2 = function (){}
Obj.d = undefined
Obj.fn3 = undefined
--------------------------------------
A.a = undefined
A.fn = undefined
A.b = 22
A.fn1 = function (){}
A.c = undefined
A.fn2 = undefined
A.d = 11
A.fn3 = function (){}
总结:
第一种方式
function Obj(arg){
var a = arg; //对象的私有变量 对象和原型都不能访问
var fn = function(){}; //对象的私有函数 对象和原型都不能调用
}
声明后 不管对象本身还是原型继承对象后的子类都没办法直接访问.
**************************************************************
第二种方式
function Obj(arg){
this.a = arg; //对象的私有变量 对象和原型都不能访问
this.fn = function(){}; //对象的私有函数 对象和原型都不能调用
}
第四种方式
function Obj(arg){
}
Obj.prototype.d = 11; //原型的属性 对象本身访问不到
Obj.prototype.fn3 = function(){}; //原型的方法 对象本身访问不到
第二和第四种方式放在一起都是原型继承对象后的子类可以访问到,但是原对象本身访问不到.
*****************************************************************
第三种方式
function Obj(arg){
}
Obj.c = 1; //对象的公有变量 对象能访问原型不能
Obj.fn2 = function(){}; //对象的公有函数 对象能调用原型不能
对象本身扩展后方法和属性,继承对象后的原型访问不到.
第1,3,4种方法很好理解. 第2种方法对象本身不能直接访问闭包内的变量能够理解. 但是使用关键字this后继承对象的原型就可以调用这些属性和方法值得深入研究. 关键字this的特性.
this是指向对象原型new之后新创建的对象而不是对象自己本身. this === new self() === _proto_
javascript对象的属性,方法,prototype作用范围分析.的更多相关文章
- 275 原型与原型链:显式原型prototype ,隐式原型__proto__,隐式原型链,原型链_属性问题,给原型对象添加属性/方法
1.所有函数都有一个特别的属性 prototype : 显式原型属性 [普通构造函数的实例对象没有prototype 属性,构造函数有__proto__属性,原型对象有__proto__属性 ] 2. ...
- js中__proto__, property, prototype, 对象自身属性方法和原型中的属性方法的区别
__proto__: 这个属性是实例对象的属性,每个实例对象都有一个__proto__属性,这个属性指向实例化该实例的构造函数的原型对象(prototype). proterty:这个方法是对象的属性 ...
- 创建JAVASCRIPT对象3种方法
创建JAVASCRIPT对象3种方法 方法一:直接定义并创建对象实例 var obj = new Object(); //创建对象实例 //添加属性obj.num = 5; //添加属性 o ...
- javascript对象事件绑定方法
javascript对象事件绑定方法 今天在做对象事件绑定的过程中出现了一点异外情况,由于事件方法是由参数传过来的,需要将当前对象call过去,方便方法体里直接调用this 错误写法 obj.oncl ...
- javaScript 对象的hasOwnProperty方法打印window自定义属性
for (var name in window) { if (window.hasOwnProperty(name)) { window.console.log ( name + " : & ...
- JavaScript 对象 - 与属性的相关知识
function inherit(p){ if(p == null) throw TypeError(); if(Object.create) return Object.create(p); var ...
- JavaScript | 对象与属性
———————————————————————————————————————————— 对象:JavaScript是基于原型的语言,没有Class,所以将函数作为类 - - - - - - - - ...
- JavaScript对象的valueOf()方法
js对象中的valueOf()方法和toString()方法非常类似,但是,当需要返回对象的原始值而非字符串的时候才调用它,尤其是转换为数字的时候.如果在需要使用原始值的上下文中使用了对象,JavaS ...
- JavaScript对象之属性标签
本文介绍一下js对象的属性标签(configurable.writable.enumerable.value.get.set)的使用. 上图的要点为: 1.Object.getOwnPropertyD ...
随机推荐
- Java LinkedList
LinkedList是基于双向链表实现的,先看构造方法和方法 Constructor Summary Constructors Constructor Description LinkedList() ...
- oracle学习--循环语句
oracle学习--循环语句 loop循环: create or replace procedure pro_test_loop is i number; begin i:=0; loop i:=i ...
- 修改.net反编译的dll
用.Net reflector 打开,配合reflexil工具. 有两种修改方法. 1.重写,试过,但不好用. 2.修改IL指令 一般只需修改简单的if判断. 方法:找到需要修改的行,把brfalse ...
- idea使用maven打包jar包
1.在pom.xml中加入以下内容: <?xml version="1.0" encoding="UTF-8"?> <project xmln ...
- 侯捷STL课程及源码剖析学习2: allocator
以STL 的运用角度而言,空间配置器是最不需要介绍的东西,它总是隐藏在一切组件(更具体地说是指容器,container)的背后,默默工作默默付出. 一.分配器测试 测试代码 #include < ...
- RocketMQ-quickstart(批量消费)
一.专业术语 Producer 消费生产者,负责产生消息,一般由业务系统负责产生消息 Consumer 消息消费者,负责消费消息,一般是后台系统负责异步消费 Push Consumer Consume ...
- sqlserver编号
select ROW_NUMBER() OVER (ORDER BY 字段 DESC) AS rid,* from 表名
- mysql乐观锁总结和实践(一)
最近学习了一下数据库的悲观锁和乐观锁,根据自己的理解和网上参考资料总结如下: 悲观锁介绍(百科): 悲观锁,正如其名,它指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持 ...
- golang 创建一个简单的广播echo服务器
package main; import ( "net" "fmt" "bufio" ) //里面的代码部分参考cmu440课程 //htt ...
- JSON与GSON比较
JSON: 是Android SDK官方的库,所以在开发移动端的工程时就必须使用JSON.进行数据的转换和处理 GSON: GSON适用于服务端,gson比json功能更加强大.比如在集合类的处理.自 ...