案例代码:

 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

最新文章

  1. UML基本介绍
  2. 详解Winform里面的缓存使用
  3. OpenCV3编程入门笔记(5)重要章节小节及核心函数
  4. angular 管理后台
  5. Vue.js中Directive知识
  6. java中 引用类型 和 基本类型 有何区别?
  7. linux查看网卡个数及速度
  8. JSP中的EL语言
  9. shape的使用
  10. 【深度学习笔记】(二)基于MNIST数据集的神经网络实验
  11. 升级 phpStudy 中 MySQL 版本至 5.7.17
  12. 将代码上传版本库gitee
  13. HAProxy 实现 mysql 负载均衡
  14. Django REST framework 第二章 Request and Response
  15. [R] t.test()
  16. BZOJ4229选择——LCT+并查集+离线(LCT动态维护边双连通分量)
  17. JDK中关于BIO,NIO,AIO,同步,异步介绍
  18. CM (Cloudera Manager) 的安装,便于CDH的离线部署
  19. linux下如何查看多核负载情况【转】
  20. 协同过滤 spark scala

热门文章

  1. aiohttp笔记
  2. [LeetCode] Maximum Subarray Sum
  3. Vue基础-渲染函数-插槽
  4. 160304-02、JS 中如何判断null 和undefined
  5. Hadoop伪分布安装详解(一)
  6. ELK basic---http://udn.yyuap.com/doc/logstash-best-practice-cn/filter/grok.html
  7. CNI插件编写框架分析
  8. SDUT3165:Round Robina(循环链表)
  9. Java中二叉树存储结构实现
  10. Jquery源码分析(一)