<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>
相关推荐
其中,shap2D是基类,它定义了两个静态变量getArea和getPerimeter,分别表示几何图形的面积和周长。 circle类继承自shap2D,并添加了自己的成员变量r,表示圆的半径。circle类还重写了getArea和getPerimeter方法,...
对象是JavaScript的核心特性,基于原型的继承机制使得对象之间能共享属性和方法。ES6引入了类(class),提供了更面向对象的语法糖,但实际上仍然是基于原型的。类是构造函数的语法糖,它们创建实例时会调用构造函数...
总之,`Classify.js`是一个强大的JavaScript库,为经典对象继承提供了解决方案,使开发者能更好地管理和扩展代码。它简化了JavaScript的面向对象编程,同时引入了一些在原生语言中缺乏的功能,提高了代码的可维护性...
- ES6支持直接定义静态方法和属性,而ES5中需要通过构造函数的原型链来实现。 通过以上对比,我们可以看到ES6中的类定义相比ES5提供了更多便捷的功能,同时也更加符合面向对象的设计原则。尽管如此,了解ES5中的类...
原型链使得对象能共享属性和方法,实现继承。 三、函数与闭包 函数在JavaScript中既是值,又是第一类公民。可以作为参数传递,也可以作为返回值。闭包是指有权访问另一个函数作用域中变量的函数,它可以记住并访问...
每个对象都包含一组属性(即数据成员)和方法(即成员函数)。通过这种方式,程序可以被分解成多个相互协作的对象,每个对象都有特定的责任。面向对象编程的主要优点包括封装、继承和多态性,这些特性有助于提高代码...
在JavaScript中,可以使用构造函数或class关键字的静态成员声明来定义静态属性和方法。 现在,我们通过一个具体的例子来说明如何在JavaScript中使用JSON对象来模拟类定义语法,并实现私有成员、受保护成员和静态...
- JavaScript的对象继承机制,通过原型对象实现属性和方法的共享。 6. **S.O.L.I.D五大原则**: - 单一职责原则(Single Responsibility Principle, SRP):每个类只有一个职责。 - 开闭原则(Open/Closed ...
Function对象代表函数,JavaScript中的函数也是对象,可以拥有属性和方法。`arguments`对象是每个函数内部的,用于访问函数调用时传递的参数。`call()`和`apply()`方法允许你在不同的上下文中调用函数,`bind()`则...
这种方式更像是一种编码规范,因为JavaScript本身并没有内置的访问控制,这种约定并不能阻止外部代码访问这些属性和方法。 3. 利用闭包创建真正的私有变量 这是一种实现真正封装的方法。JavaScript中函数作用域的...
- **Form**: 表单对象及其属性和方法。 #### 三、高级特性 **3.1 JavaScript框架编程** - **概念**: 利用现成的JavaScript库或框架,简化开发过程。 - **流行框架**: - **jQuery**: 轻量级库,简化HTML文档遍历...
此外,JavaScript中的私有变量、公有变量和静态变量是通过作用域而非明确的访问修饰符(如Java中的private、public、static)来实现的。 ### Prototype与继承 JavaScript中的原型(Prototype)机制允许对象间共享...
在 ES6 之后,JavaScript 拥有了 class 关键字,虽然本质依然是构造函数,但是使用起来已经方便了许多。 然而,JavaScript 的 class 依然有一些特性还没有加入,比如修饰符和抽象类。TypeScript 的 class 支持面向...
`super`关键字在Java中用于访问父类的成员,包括被隐藏的成员变量、被重载的方法,以及调用父类的构造函数。 Java的垃圾收集机制自动管理内存,当对象不再被引用时,系统会进行垃圾收集并释放资源。程序员无需手动...
`Class.create()`返回的构造函数类似于C#或JAVA中的类定义,可以理解为继承自`Object`基类。 3. **Abstract对象**:`Abstract`是一个空对象,主要用于定义抽象类。通过将类定义放在`Abstract`下,可以明确区分抽象...
全局对象是所有JavaScript代码的上下文,它包含了一些基本的属性和方法,如`window`(在浏览器环境中)、`global`(在Node.js环境中),以及全局函数`eval()`、`isNaN()`、`parseInt()`和`parseFloat()`等。...
7. 抽象类(Abstract Class)与抽象方法:允许创建不能实例化的基类,为子类提供模板。 三、模块与命名空间 8. 模块(Modules):TypeScript 使用 ES6 的导入导出语法支持模块化,也可以使用内部的命名空间系统,...
1. 类的使用:TypeScript 支持类的定义,包括构造函数、属性和方法。类可以包含访问修饰符(如 `public`、`private`、`protected`),控制成员的访问权限。 2. 类的继承:子类可以继承父类的属性和方法,实现代码...
这使得即使不能从多个基类继承状态和行为,也能够通过实现多个接口来达到类似的效果。例如: ```csharp interface IA { } interface IB { } class MyClass : IA, IB { // 实现IA和IB中的成员 } ``` ### 遍历集合 ...