这篇文章主要为大家详细介绍了Javascript中的面向对象入门实例(二),具有一定的参考价值,可以用来参考一下。
严格来说,Javascript并不是一门面向对象的语言,因为它没有原生提供完整的面向对象机制。但它的语言特性又允许我们去模拟大部分这些机制。
/**
* 面向对象入门实例(二)
*
* @param
* @arrange (512.笔记) www.q1010.com
**/
var arr = new Array(10); // 创建长度为10的数组
var date = new Date; // 不需要传参数给构造函数时,括号可以省略
与C#不同的是,Javascript中new的是函数而不是class,这个函数即为类的构造函数。在构造函数中,可以声明属性和方法。例如:
function Square() {
this.length = 1;
this.perimeter = function() {
return this.length * 4;
};
}
var square = new Square();
square.perimeter(); // 4
square.length = 10;
square.perimeter(); // 40
虽然上面的代码看上去很正常,但实际上存在一个缺陷:
/**
* 面向对象入门实例(二)
*
* @param
* @arrange (512.笔记) www.q1010.com
**/
var square1 = new Square();
var square2 = new Square();
square1.perimeter === square2.perimeter; // false
由于每次创建Square对象执行构造函数时都创建了新的函数perimeter,所以多个Square对象的perimeter并非指向同一个函数。这样会造成内存的浪费。要解决这个问题,可以使用原型链。
/**
* 面向对象入门实例(二)
*
* @param
* @arrange (512.笔记) www.q1010.com
**/
var arr = new Array();
arr.__proto__ === Array.prototype; // true
那么Array.prototype.__proto__又是什么呢?在控制台打印出来可以发现,是一个Object对象,所以:
/**
* 面向对象入门实例(二)
*
* @param
* @arrange (512.笔记) www.q1010.com
**/
Array.prototype.__proto__ === Object.prototype; // true
Object.prototype.__proto__; // null
Object类是所有类型的基类,所以它的prototype的__proto__属性为null。最后得出arr的原型链为:
/**
* 面向对象入门实例(二)
*
* @param
* @arrange (512.笔记) www.q1010.com
**/
arr.__proto__
Array.prototype
Array.prototype.__proto__
an Object object
object.__proto__
Object.prototype
Object.prototype.__proto__
null
原型链的用处在于:当访问对象的某个属性或方法时,如果对象本身没有这个属性或方法,就会在原型链中由浅到深进行查找(浅处优先)。同样地有代码可以证实这一规则:
/**
* 面向对象入门实例(二)
*
* @param
* @arrange (512.笔记) www.q1010.com
**/
var arr = new Array();
// arr本身没有push
arr.hasOwnProperty('push'); // false
// 访问arr.push时实际上访问的是Array.prototype.push。
arr.push === arr.__proto__.push; // true
arr.push === Array.prototype.push; // true
不难发现,即使有多个Array对象,它们也是共享Array.prototype上的方法。所以,借助原型链就可以解决前面提到的多个函数副本浪费内存的问题:
/**
* 面向对象入门实例(二)
*
* @param
* @arrange (512.笔记) www.q1010.com
**/
function Square() {
this.length = 1;
}
Square.prototype.perimeter = function() {
return this.length * 4;
};
var square1 = new Square();
var square2 = new Square();
square1.perimeter === square2.perimeter; // true
/**
* 面向对象入门实例(二)
*
* @param
* @arrange (512.笔记) www.q1010.com
**/
function Shape() {
this.name = '形状';
}
Shape.prototype.perimeter = function() { };
function Square() {
this.length = 1;
}
// Javascript中没有抽象类的概念,所以Shape是可以实例化的
Square.prototype = new Shape(); // important
Square.prototype.perimeter = function() {
return this.length * 4;
};
var square = new Square();
square.name; // '形状'
square.perimeter(); // 4
其中最为关键的就是把一个Shape对象加入到Square的原型链中去。根据原型链的规则:
/**
* 面向对象入门实例(二)
*
* @param
* @arrange (512.笔记) www.q1010.com
**/
function Square() {
var length = 1;
this.setLength = function(len) {
length = len;
};
this.getLength = function() {
return length;
};
this.perimeter = function() {
return length * 4;
};
}
var square = new Square();
square.perimeter(); // 4
square.setLength(10);
square.perimeter(); // 40
由于length变量的作用域是在Square内,所以外部无法访问,也就达到了私有的效果。但这样一来,三个方法就不能写到Square.prototype上,因为一旦它们脱离了Square的作用域,就无法访问length了。
/**
* 面向对象入门实例(二)
*
* @param
* @arrange (512.笔记) www.q1010.com
**/
function Square() {
this.__length = 1;
}
Square.prototype.setLength = function(len) {
this.__length = len;
};
Square.prototype.getLength = function() {
return this.__length;
};
Square.prototype.perimeter = function() {
return this.__length * 4;
};
var square = new Square();
square.perimeter();
square.setLength(10);
square.perimeter();
/**
* 面向对象入门实例(二)
*
* @param
* @arrange (512.笔记) www.q1010.com
**/
// 以new Foo()为例
var obj = { };
obj.__proto__ = Foo.prototype;
Foo.call(obj);
大家不妨以此过程回顾前面的代码段。本文来自:http://www.q1010.com/174/1651-0.html
注:关于Javascript中的面向对象入门实例(二)的内容就先介绍到这里,更多相关文章的可以留意四海网的其他信息。
关键词:面向对象
四海网收集整理一些常用的php代码,JS代码,数据库mysql等技术文章。