JavaScript 中继承的一些示例

简介:

prototype 属性的作用:

利用prototype 属性提供对象的类的一组基本功能。对象的新实例“继承”赋予该对象原型的操作。

prototype 属性的功能:

所有JavaScript 内部对象都有只读的prototype 属性。可以为内部对象的原型添加功能,但该对象不能被赋予不同的原型。

然而,用户定义的对象可以被赋给新的原型。

constructor 属性的作用:
constructor 表示创建对象的函数。

constructor 属性的功能:
constructor 属性是所有具有 prototype 的对象的成员。它们包括除 Global 和 Math 对象以外的所有 JavaScript 内部对象。
constructor 属性保存了对构造特定对象实例的函数的引用。

A 利用prototype 添加对象的属性 [ 方式一]

示例:

<script type="text/javascript">
//方式一
var myObj = function(){
this.study = "JavaScript";
}
myObj.prototype.hobby = function()
{
this.hobby = "See girl";
}
var newObj = new myObj();
for ( var attr in newObj )
{
document.write( attr +"<br/>" );
}
</script>

B 利用prototype 添加对象的属性 [ 方式二]

示例:

<script type="text/javascript">
//方式二
var superObj = { name:"xugang" };
var subObj = { age:20 };
function extend(superObj,subObj){
//获得父对象的原型对象
subObj.getSuper = superObj.prototype;
//将父对象的属性给子对象
for(var i in superObj){
subObj[i] = superObj[i];
}
}
extend(superObj,subObj);
for ( var s in subObj )
{
document.write( s +"<br/>" ); //遍历子对象的属性
}
</script>

C 利用prototype 继承父类的原型属性

示例:

<script>
function Person(_name){
this.name = _name;
}
//创建对象(用于更改 prototype 原型对象)
function addSex(_sex){
this.sex = _sex;
}
//更改原型对象
Person.prototype = new addSex('');
var p = new Person('xugang');
alert("p 的原型为:" + p.constructor);
//打印所有属性
for(var i in p){
//alert(p[i]);
}
// ================= 继承 =================
//创建子对象 Student
function Student(_study){
this.study = _study;
}
// 通过 prototype Student 继承 Person
Student.prototype = new Person('刘德华');
var stu1 = new Student('JS');
alert("stu1 的原型为:" + stu1.constructor);
for(var i in stu1){
alert(stu1[i]);
}
</script>

因为Student 对象的原型更改为Person 对象,而Person 对象的原型更改为addSex ,所以,Student 对象的原型为addSex 。

注意:一个对象的原型是在 new 对象的那一刻确定的,如果在 new 对象以后更改无效!

D 如何设置对象的原型对象和构造函数

示例:

<script type="text/javascript">
function B(){
this.name = "刘德华";
return "B方法";
}
function C(){
this.age = 42;
return "C方法";
}
B.prototype = new C();
var b = new B();
b.constructor = B; //重写b的构造方法为B本身
document.write("b 的构造方法:");
document.write(b.constructor() + "<br/>");
document.write("b 的原型对象的构造方法:");
document.write(b.constructor.prototype.constructor() + "<br/>");
for ( var m in b )
{
document.write("属性:" + m );
document.write(" 值:" + b[m] +"<br/>");
}
</script>

结果如下:

b 的构造方法:B方法
b 的原型对象的构造方法:C方法
属性:age 值:42
属性:name 值:刘德华

E 对象中用来保存原型的 __proto__ 变量

示例:

<script type="text/javascript">
function myObject(){}
var my = new myObject();
//任何对象都会有一个隐藏的 __proto__ 变量用来保存原型
document.write(my.__proto__ + "<br/>");
// Internet Explorer 下显示为:undefined
// Mozilla Firefox 下显示为:[object Object]
function Person(){
this.name = "刘德华";
return "Person 方法";
}
/*
定义方法后,在内存中相当于:
Person.prototype = { constructor:Person }
*/
//改变 Person 对象的原型对象
function Super_Person(){
this.hobby = "唱歌";
return "Super_Person 方法";
}
Person.prototype = new Super_Person();
var newObj = new Person();
/* 使用 new 创建对象过程:
var o = {};
Person.prototype.constructor.call(o);
o = {__proto__:Person.prototype,name = "刘德华"};
return o;
*/
document.write(newObj.constructor.prototype.constructor() + "<br/>");
//打印newObj原型对象(在 IE 下无效!)
document.write(newObj.__proto__.constructor() + "<br/>");
</script>

在 Firefox 中的结果如下:

[object Object]
Super_Person 方法
Super_Person 方法




本文转自钢钢博客园博客,原文链接:http://www.cnblogs.com/xugang/archive/2010/08/06/1793627.html,如需转载请自行联系原作者

相关文章
|
JavaScript 前端开发 Java
深入JS面向对象(原型-继承)(一)
深入JS面向对象(原型-继承)
31 0
|
1月前
|
JavaScript 前端开发
js开发:请解释原型继承和类继承的区别。
JavaScript中的原型继承和类继承用于共享对象属性和方法。原型继承利用原型链查找属性,节省内存但不支持私有成员。类继承通过ES6的class和extends实现,支持私有成员但占用更多内存。两者各有优势,适用于不同场景。
19 0
|
3月前
|
JavaScript
|
3月前
|
JavaScript 前端开发
原型继承在 JavaScript 中是如何工作
原型继承在 JavaScript 中是如何工作
20 0
|
3月前
|
JavaScript 前端开发
JS实现继承的6种方式
JS实现继承的6种方式
|
1月前
|
JavaScript
js开发:请解释什么是ES6的扩展运算符(spread operator),并给出一个示例。
ES6的扩展运算符(...)用于可迭代对象展开,如数组和对象。在数组中,它能将一个数组的元素合并到另一个数组。例如:`[1, 2, 3, 4, 5]`。在对象中,它用于复制并合并属性,如`{a: 1, b: 2, c: 3}`。
12 3
|
1月前
|
JavaScript
js开发:请解释什么是ES6的默认参数(default parameters),并给出一个示例。
ES6允许在函数参数中设置默认值,如`function greet(name = &#39;World&#39;) {...}`。当调用函数不传入`name`参数时,它将默认为&#39;World&#39;,提升代码简洁性和可读性。例如:`greet()`输出&quot;Hello, World!&quot;,`greet(&#39;Alice&#39;)`输出&quot;Hello, Alice!&quot;。
15 4
|
1月前
|
SQL JavaScript
js开发:请解释什么是ES6的模板字符串(template string),并给出一个示例。
ES6的模板字符串以反引号包围,支持变量和表达式插入以及多行书写。例如,插入变量值`Hello, ${name}!`,计算表达式`${num1 + num2}`,以及创建多行字符串。模板字符串保留原始空格和缩进,简化了字符串拼接,提高了代码可读性。
18 6
|
1月前
|
JavaScript 前端开发
js开发:请解释什么是事件委托(event delegation),并给出一个示例。
事件委托是JavaScript中优化事件处理的技术,通过绑定事件处理器到共享的父元素,利用事件冒泡机制来处理子元素的事件。这种方法能提升性能、简化代码并降低内存消耗。示例展示了如何在父元素上监听`click`事件,然后通过`event.target`识别触发事件的具体子元素(如`&lt;li&gt;`),实现对动态生成列表项的点击事件处理。
|
1月前
|
设计模式 JavaScript 前端开发
JavaScript中继承的优缺点
JavaScript中继承的优缺点
13 3