`

非构造函数继承_解决Javascript不能继承基类静态方法和静态变量

 
阅读更多
<html>
<head>
<title>非构造函数继承_解决Javascript不能继承基类静态方法和静态变量</title>
</head>

<body>

</body>
<script language="javascript">
  var People = 
  {
  nation:'中国'
 };

  var Doctor =
  {
   career:'医生'
 }

  //json格式的发明人Douglas Crockford,提出了一个object()函数,可以做到这一点。
 function object(o) 
  {
   function F() {}
  F.prototype = o;
  return new F();
 }
  //这个object()函数,其实只做一件事,就是把子对象的prototype属性,指向父对象,
  //从而使得子对象与父对象连在一起。使用的时候,第一步先在父对象的基础上,生成子对象:
 // var Doctor = object(Chinese); 然后,再加上子对象本身的属性:
 // Doctor.career = '医生'
  //这时,子对象已经继承了父对象的属性了。
 // alert(Doctor.nation); //中国
  
  
  //浅拷贝
  function extendCopy(p) 
  {
  var c = {};
  for (var i in p) 
    { 
   c[i] = p[i];
  }
  c.uber = p;
  return c;
 }

  //深拷贝
  function deepCopy(p, c) 
  {
  var c = c || {};
  for (var i in p) 
    {
   if (typeof p[i] === 'object') 
      {
     c[i] = (p[i].constructor === Array) ? [] : {};
    deepCopy(p[i], c[i]);
   } 
      else 
      {
     c[i] = p[i];
   }
  }
  return c;
  }
  
  
  //参见 非构造函数的继承
  //http://www.ruanyifeng.com/blog/2010/05/object-oriented_javascript_inheritance_continued.html
  //上面深拷贝方式实现的是对象继承.
  
  /*************************************************************************************************/
  
  //定义这个基类
  function Person()
  {
    this.type = "Human"; 
  }
  //这里Person是一个对象
  
  //静态变量
  Person.mouth = 1;
  Person.sayHello = function()
  {
    alert("Hello"); 
  }
  
  //定义一个子类
  function Chinese()
  {
    this.type = "Chinese";  
  }
  
  //因为使用function定义了Person和Chinese类后,Person和Chinese就分别表示两个对象
  //于是可以使用下面浅拷贝的方式继承基类的 静态变量和方法了
  //for(obj in Person)
  //{
  //   Chinese[obj] = Person[obj];
  //   console.log(Person[obj]);
  //}
  //但是为了防止静态变量是数组,所以使用深拷贝方式 继承静态变量和方法
  
  deepCopy(Person,Chinese);
  
  Chinese.sayHello(); //已经继承了基类的 静态方法
  console.log(Chinese.mouth); //继承了基类的静态变量
  
  var aChinese = new Chinese(); //依然可以使用这样的方式创建对象
  console.log(aChinese);
  
</script>
</html>

 

分享到:
评论

相关推荐

    JAVA继承类求几何图形面积周长代码.doc

    其中,shap2D是基类,它定义了两个静态变量getArea和getPerimeter,分别表示几何图形的面积和周长。 circle类继承自shap2D,并添加了自己的成员变量r,表示圆的半径。circle类还重写了getArea和getPerimeter方法,...

    Javascript学习总结

    - **使用对象冒充实现继承**:通过构造函数调用基类的构造函数。 - **继承原型对象中的属性和方法**:通过`__proto__`属性或`Object.setPrototypeOf()`方法。 - **封装继承方法**:使用组合模式或其他设计模式实现...

    JavaScript开发技术大全

    对象是JavaScript的核心特性,基于原型的继承机制使得对象之间能共享属性和方法。ES6引入了类(class),提供了更面向对象的语法糖,但实际上仍然是基于原型的。类是构造函数的语法糖,它们创建实例时会调用构造函数...

    Classify.js:用于经典对象继承的 JavaScript 库

    总之,`Classify.js`是一个强大的JavaScript库,为经典对象继承提供了解决方案,使开发者能更好地管理和扩展代码。它简化了JavaScript的面向对象编程,同时引入了一些在原生语言中缺乏的功能,提高了代码的可维护性...

    【JavaScript源代码】ES5和ES6中类的区别总结.docx

    - ES6支持直接定义静态方法和属性,而ES5中需要通过构造函数的原型链来实现。 通过以上对比,我们可以看到ES6中的类定义相比ES5提供了更多便捷的功能,同时也更加符合面向对象的设计原则。尽管如此,了解ES5中的类...

    JavaScript v2.0 参考大全

    原型链使得对象能共享属性和方法,实现继承。 三、函数与闭包 函数在JavaScript中既是值,又是第一类公民。可以作为参数传递,也可以作为返回值。闭包是指有权访问另一个函数作用域中变量的函数,它可以记住并访问...

    C++常见问题解答。。。。。。。。。

    每个对象都包含一组属性(即数据成员)和方法(即成员函数)。通过这种方式,程序可以被分解成多个相互协作的对象,每个对象都有特定的责任。面向对象编程的主要优点包括封装、继承和多态性,这些特性有助于提高代码...

    Javascript类定义语法,私有成员、受保护成员、静态成员等介绍

    在JavaScript中,可以使用构造函数或class关键字的静态成员声明来定义静态属性和方法。 现在,我们通过一个具体的例子来说明如何在JavaScript中使用JSON对象来模拟类定义语法,并实现私有成员、受保护成员和静态...

    深入理解JavaScript系列1

    - JavaScript的对象继承机制,通过原型对象实现属性和方法的共享。 6. **S.O.L.I.D五大原则**: - 单一职责原则(Single Responsibility Principle, SRP):每个类只有一个职责。 - 开闭原则(Open/Closed ...

    JavaScript核心对象参考手册

    Function对象代表函数,JavaScript中的函数也是对象,可以拥有属性和方法。`arguments`对象是每个函数内部的,用于访问函数调用时传递的参数。`call()`和`apply()`方法允许你在不同的上下文中调用函数,`bind()`则...

    简单理解JavaScript中的封装与继承特性

    这种方式更像是一种编码规范,因为JavaScript本身并没有内置的访问控制,这种约定并不能阻止外部代码访问这些属性和方法。 3. 利用闭包创建真正的私有变量 这是一种实现真正封装的方法。JavaScript中函数作用域的...

    javascript 基础教程

    - **Form**: 表单对象及其属性和方法。 #### 三、高级特性 **3.1 JavaScript框架编程** - **概念**: 利用现成的JavaScript库或框架,简化开发过程。 - **流行框架**: - **jQuery**: 轻量级库,简化HTML文档遍历...

    ajax培训.AJAX 的入门知识

    此外,JavaScript中的私有变量、公有变量和静态变量是通过作用域而非明确的访问修饰符(如Java中的private、public、static)来实现的。 ### Prototype与继承 JavaScript中的原型(Prototype)机制允许对象间共享...

    前端大厂最新面试题-class.docx

    在 ES6 之后,JavaScript 拥有了 class 关键字,虽然本质依然是构造函数,但是使用起来已经方便了许多。 然而,JavaScript 的 class 依然有一些特性还没有加入,比如修饰符和抽象类。TypeScript 的 class 支持面向...

    java复习题(同名8811).doc

    `super`关键字在Java中用于访问父类的成员,包括被隐藏的成员变量、被重载的方法,以及调用父类的构造函数。 Java的垃圾收集机制自动管理内存,当对象不再被引用时,系统会进行垃圾收集并释放资源。程序员无需手动...

    【Prototype 1.4.0】源码解读----全文注释版

    `Class.create()`返回的构造函数类似于C#或JAVA中的类定义,可以理解为继承自`Object`基类。 3. **Abstract对象**:`Abstract`是一个空对象,主要用于定义抽象类。通过将类定义放在`Abstract`下,可以明确区分抽象...

    JavaScript内置对象导览图

    全局对象是所有JavaScript代码的上下文,它包含了一些基本的属性和方法,如`window`(在浏览器环境中)、`global`(在Node.js环境中),以及全局函数`eval()`、`isNaN()`、`parseInt()`和`parseFloat()`等。...

    TypeScript 使用手册(中文版)翻译

    7. 抽象类(Abstract Class)与抽象方法:允许创建不能实例化的基类,为子类提供模板。 三、模块与命名空间 8. 模块(Modules):TypeScript 使用 ES6 的导入导出语法支持模块化,也可以使用内部的命名空间系统,...

    个人学习TS的基本知识点

    1. 类的使用:TypeScript 支持类的定义,包括构造函数、属性和方法。类可以包含访问修饰符(如 `public`、`private`、`protected`),控制成员的访问权限。 2. 类的继承:子类可以继承父类的属性和方法,实现代码...

    C#考试题!

    这使得即使不能从多个基类继承状态和行为,也能够通过实现多个接口来达到类似的效果。例如: ```csharp interface IA { } interface IB { } class MyClass : IA, IB { // 实现IA和IB中的成员 } ``` ### 遍历集合 ...

Global site tag (gtag.js) - Google Analytics