JS类、对象、方法、prototype、_proto_
案例代码:
function People(name) {
//对象属性
this.name = name;
//对象方法
this.Introduce = function() {
alert("My name is " + this.name);
}
}
//类方法
People.Run = function(){
alert("I can run");
}
//原型方法
People.prototype.IntroduceChinese = function() {
alert("我的名字是" + this.name);
}
测试:
var p1 = new People("guanghe");
分析:
对象方法需要通过实例化对象去调用:
p1.Introduce();
原型方法也需要通过实例化对象去调用,js查找属性在对象本身查不到,会去查其构造方法的原型的属性,而不是构造方法的属性:
p1.IntroduceChinese();
其实等同于:
p1._proto_.IntroduceChinese();
类方法不需要通过实例化对象去调用,实例化的对象反而调不到:
People.Run();
想要通过对象调用类的方法,因为其构造方法即为父类,所以可以这样调用:
p1.constructor.Run();
总结:
由此可见,p1在被创建之时,继承了People的prototype(其实是生成了指向其构造方法原型的指针_proto_),并执行了构造方法。通过每个js向都有的_proto_属性,能够访问到构造方法的原型的属性,形式上直接调用,就像在访问自己的属性一样。而构造方法的属性却不能直接访问,要调用还要使用constructor属性间接进行调用。
知识点:
1,js一切皆对象,方法也是对象
2,js对象的_proto_指向其constructor的prototype
3,js一般对象没有prototype属性,类(方法)对象才有
4,js通过new出来的对象能够访问其构造方法原型的所有属性,但不能直接访问构造方法的属性
5,js的对象是动态的
//创建一个对象
p1 = new People();
//给其构造方法的原型添加属性
People.prototype.a = 1;
//之前创建的对象能够访问到新添加的属性
p1.a
JS类、对象、方法、prototype、_proto_的更多相关文章
- 几种常用的JS类定义方法
几种常用的JS类定义方法 // 方法1 对象直接量var obj1 = { v1 : "", get_v1 : function() { return ...
- 全面了解python中的类,对象,方法,属性
全面了解python中的类,对象,方法,属性 python中一切皆为对象,所谓对象:我自己就是一个对象,我玩的电脑就是对象,坐着的椅子就是对象,家里养的小狗也是一个对象...... 我们通过描述属性( ...
- js 继承 对象方法与原型方法
js函数式编程确实比很多强语言使用灵活得多,今天抽了点时间玩下类与对象方法调用优先级别,顺便回顾下继承 暂时把原型引用写成继承 先看看简单的两个继承 var Parent = function(){} ...
- 几种常用的JS类定义方法(转)
// 方法1 对象直接量 var obj1 = { v1 : "", get_v1 : function() { return this.v1; }, set_v1 : funct ...
- JS定义对象方法?
第一种:构造函数形式 把参数作为构造函数的参数传递,这样对于对象的初始化更灵活一点 <script language="javascript"><!-- /** ...
- JS:Math 对象方法
Math 对象方法方法 描述Math.ceil(x) 对数进行上舍入.(向上取整:大于等于x的最小整数)Math.floor(x) 对数进行下舍入.(小于等于x的最大整数)Ma ...
- JS类对象实现继续的几种方式
0. ES6可以直接使用class,extends来继承. 1. 原型继承 父类: function Persion(name,age){ this.name = name; this.age = ...
- 原生js实例对象方法
Array中的方法 ☞ toString() // 把数组转换为字符串,使用逗号分隔☞ valueOf() // 返回数组对象本身 ☞ 栈方法(先进后出)ary.push() // 该方法有一个返回值 ...
- js数组对象方法
- js string对象方法
substr(start,length) substring(start,end) 返回子串,原字符串不改变.
随机推荐
- SpringCloud--注册中心Eureka
Eureka的服务治理设计中,所有节点即是服务提供方,也是服务消费方. Eureka Server的高可用:就是将自己作为服务向其他服务注册中心注册自己,形成一组互相注册的服务注册中心,实现服务清单的 ...
- Zabbix高可用
上一篇:Zabbix数据库表结构 安装两台Zabbix-server 两台均安装MySQL数据库 数据库做双主互相同步 keepalive做vip偏移 to_master.sh脚本 两边都要安装ssh ...
- HTML5跨平台开发环境配置
http://hi.baidu.com/kuntakinte/item/1bbd3759b4901a3695eb050c
- Powershell替代和截断——replace and substring
一:截取一个字符串的尾部,替代字符串中的特定字符或替代字符串中特定位置的特定字符 $a="W.endy.chen.SHAO" $b=$a.Substring(0,$a.Length ...
- swift中类与结构体
写了12个Person来复习,不过完成同样的代码需要敲键盘的次数相比OC确实少了很多,这很多应该归功于Swift中不写分号,以及少了OC中的中括号. 一.类与结构体 两者在Swift中差不了多少了 类 ...
- bootloader,kernel,initrc
http://www.ibm.com/developerworks/cn/linux/l-k26initrd/index.html http://www.68idc.cn/help/server/li ...
- lua相关库安装常见问题
一.先安装lua brew install lua 我本机的安装路径为:/usr/local/Cellar/lua/5.3.4_2 二.安装luarocks 下载luarocks的安装包: http: ...
- 如何让thrift0.9.2 在macos上面编译通过?
为将来跨语言通信预研,选择了thrift来试试.结果在mac os上面安装遇到种种困难,不知道是我选择方法错误还是咋的,不管怎样,总算是编译过去了. 首先,我们来参考官网的安装步骤:https://t ...
- 程序猿Web面试之jQuery
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/powertoolsteam/article/details/32325013 又到了一年一度的 ...
- Java中的高精度整数和高精度小数
在实际编码中,会遇到很多高精度的事例,比如,在计算金钱的时候就需要保留高精度小数,这样计算才不会有太大误差: 在下面的代码中,我们验证了,当两个float型的数字相加,得到的结果和我们的预期结果是有误 ...