js prototype 理解

简单理解:prototype对象是实现面向对象的一个重要机制。每个函数也是一个对象,它们对应的类就是

function,每个函数对象都具有一个子对象prototype。Prototype 表示了该函数的原型,

prototype表示了一个类的属性的集合。当通过new来生成一个类的对象时,prototype对象的属

性就会成为实例化对象的属性。 (类似反射出来的一样)

ps.(在JS 里面 全都是对象,  类Function是function的顶级超类,function实例化了叫对象,在function未实例定义的时候,其实这个定义也是属于Function)

  1. <script>
  2. /*
  3. * 关于prototype,理解这个很有必要
  4. * 可以在类型上使用proptotype来为类型添加行为。这些行为只能在类型的实例上体现。
  5. * JS中允许的类型有Array, Boolean, Date, Enumerator, Error, Function, Number, Object, RegExp, String
  6. * 以后这样分,没有实例化的类称为类型,实例化的类称为对象实例简称实例
  7. */
  8. Object.prototype.name = "zhangsan";
  9. Object.prototype.nihao = function(){
  10. alert("i can method name is "+this.name);
  11. }
  12. var obj = new Object();
  13. obj.nihao();
  14. alert(obj.name);
  15. //在实例上不能使用prototype,否则会发生编译错误
  16. obj.prototype.sex = "男";//error,无法给一个实例prototype
  17. var o = {
  18. name:"zhangsan"
  19. }
  20. o.prototype.age = 30;//error,无法给一个实例prototype
  21. //可以为类型定义“静态”的属性和方法,直接在类型上调用即可
  22. alert(Object.name);
  23. Object.nihao();
  24. //实例不能调用类型的静态属性或方法,否则发生对象未定义的错误。
  25. Object.class = "三年二班";//类静态属性
  26. var ob = new Object();
  27. alert(ob.class); //error 实例不能调用类型的静态属性和方法
  28. //可以在外部使用prototype为自定义的类型添加属性和方法。
  29. function Mytest(){
  30. this.name = "zhangsan";
  31. this.age = 20;
  32. }
  33. Mytest.prototype.hello = function(){
  34. alert(this.name);
  35. }
  36. var m = new Mytest();
  37. m.hello();
  38. //在外部不能通过prototype改变自定义类型的属性或方法。
  39. //该例子可以看到:调用的属性和方法仍是最初定义的结果。
  40. Mytest.prototype.name = "lisi";
  41. var mm = new Mytest();
  42. alert(mm.name);
  43. //可以在对象实例上改变或增加属性。(这个是肯定的)
  44. //也可以在对象上改变或增加方法。(和普遍的面向对象的概念不同)
  45. mm.name2 = "lisi";
  46. mm.hello = function(){
  47. alert(this.name2);
  48. }
  49. //mm.hello();
  50. //继承,这个例子说明了一个类型如何从另一个类型继承。
  51. function Mytest2(){}
  52. Mytest2.prototype = new Mytest;
  53. var m2 = new Mytest2();
  54. alert(m2.name);
  55. //这个例子说明了子类如何重写父类的属性或方法。
  56. Mytest2.prototype.name = "wangwu";
  57. Mytest2.prototype.hello = function(){
  58. alert(‘i can mytest2 extend Mytest save method hello‘);
  59. }
  60. var m3 = new Mytest2();
  61. m3.hello();
  62. //子类中的name属性值不会被父类覆盖
  63. function Mytest3(){
  64. this.name = "子类中的name属性值不会被父类覆盖";
  65. this.age = 20;
  66. }
  67. Mytest3.prototype = new Mytest();
  68. var m4 = new Mytest3();
  69. alert(m4.name);
  70. </script>
时间: 2024-07-31 14:40:01

js prototype 理解的相关文章

node.js javascript理解原型继承

util.inherits util.inherits(constructor, superConstructor)是一个实现对象间原型继承的函数. JavaScript 的面向对象特性是基于原型的,与常见的基于类的不同.JavaScript 没有提供对象继承的语言级别特性,而是通过原型复制来实现的 var util = require('util'); function Base() { this.name = 'base'; this.base = 1991; this.sayHello =

js prototype

prototype 原型. 我们每创建一个函数 都会创建一个 prototype的属性,这个属性指向了这个函数的原型对象. function A(){}  ,A.prototype  ,prototype原型只能运用在对象上,不能运用在对象的实例上 也就是说 A.prototype 是可以的 var a=new A(),  a.prototype 是不可以的. 所有对象的实例共享原型对象.什么意思如下: function A(){} A.prototype.Name="张三"://为原

js深入学习-js prototype constructor属性区别

在很多js 插件中出现这两个属性的频率很高,我自己写插件时,也用到过,知道用,不知道具体的区别,今天研究了下, constructor 返回的是对象(类型的实例)的构造函数,通过prototype 添加的属性和方法不会返回. prototype 返回的是类型的原型,不会饭后构造函数部分. 实例如下: <html> <head> <script type="text/javascript">    var cat=function (name,sex)

vue自定义指令(Directive中的clickoutside.js)的理解

.array p { counter-increment: longen; margin-left: 10px } .array p::before { content: counter(longen) "." } .alink { font-size: 16px; color: blue } 阅读目录 vue自定义指令clickoutside.js的理解 回到顶部 vue自定义指令clickoutside.js的理解 vue自定义指令请看如下博客: vue自定义指令 一般在需要 DO

JS闭包理解

Js闭包理解 在很多面试题中都会问什么是js的闭包,为什么需要使用闭包,使用闭包的优缺点! 我在面试其他人的时候也喜欢问这个问题,回答的也是千奇百怪,现在就总结一下我对闭包的理解. 闭包是一种概念,这种概念比较复杂,很多地方的定义不尽相同,我的理解是:闭包是能读取函数内部变量的函数,也就是定义在函数内部的函数,成为函数内部元素与外部沟通的桥梁. 闭包的概念是有js的链式作用域引出来的,所谓链式作用域就是指:内部函数可以读取到所有的外部变量,而外部变量或者函数不能读取到函数的内部变量,变量的作用域

深入理解js——prototype原型

之前(深入理解js--一切皆是对象)中说道,函数也是一种对象.它也是属性的集合,你也可以对函数进行自定义属性.而JavaScript默认的给了函数一个属性--prototype(原型).每个函数都有一个属性叫做prototype(原型). 这个prototype的属性值是一个对象(属性的集合,再次强调!),默认的只有一个叫做constructor的属性,指向这个函数本身. prototype(原型)既然作为对象即属性的集合,不可能就只弄个constructor来玩玩,肯定可以自定义的增加许多属性

JS中的prototype理解

JS中的phototype是JS中比较难理解的一个部分 本文基于下面几个知识点: 1 原型法设计模式 在.Net中可以使用clone()来实现原型法 原型法的主要思想是,现在有1个类A,我想要创建一个类B,这个类是以A为原型的,并且能进行扩展.我们称B的原型为A. 2 javascript的方法可以分为三类: a 类方法 b 对象方法 c 原型方法 例子: function People(name){  this.name=name;  //对象方法  this.Introduce=functi

对JS prototype的理解

1.什么是prototype? function F() {} f1 = new F();f2 = new F(); 以上的代码,F()是一个构造函数,f1和f2是由这个构造函数产生的对象. prototype是构造函数的一个属性,它的值就是由这个构造函数构造出来的对象的原型对象.(换句话来说,prototype既是构造函数的属性,也是由这个构造函数构造出来的对象的原型对象) 原型对象的属性和方法都会被"继承",换句话来说,F.prototype的属性和方法都会被f1和f2"

js之prototype理解

我们创建的每个函数都有一个prototype属性,这个属性是一个指针,指向一个对象,这个对象的用途是包含可以由特定类型的所有实例共享的属性和方法,也就是说这个prototype通过调用构造函数而创建的那个对象实例的原型.使用原型的好处就是可以让所有对象实例共享它所包含的属性和方法. 例子,通过构造函数创建对象与通过原型模式创建比较. 通过构造函数创建: function Person(name, age) {//构造函数 首字母一般大写. this.name = name; this.age =