码迷,mamicode.com
首页 > Web开发 > 详细

js面向对象编程(一) 封装

时间:2015-07-07 19:01:37      阅读:130      评论:0      收藏:0      [点我收藏+]

标签:

构造函数方式定义类型

function User(userName, userRole) {

    this.userName = userName;

    this.userId = getGuid();

    this.getUserByid = function(userId) {

        var result = new User(userId);

        return result;

    };

}

//生成实例对象。

var user1 = new User("root", "administrator");

var user2 = new User("admin", "administrator");

//这时user1和user2会自动含有一个constructor属性,指向它们的构造函数。

alert(user1.constructor === User); //true

alert(user2.constructor === User); //true

//instanceof运算符,验证原型对象与实例对象之间的关系。

alert(user1 instanceof User); //true

alert(user2 instanceof User); //true

构造函数方式创建类型的缺点:

对于每一个 User 实例对象getUserByid方法都是一模一样的内容,每一次生成一个实例,都必须为重复的内容多占用一些内存。

alert(user1.getUserByid === user2.getUserByid); //false

解决方案:Prototype
在js中,每个构造函数都有Prototype属性,指向另一个对象。这个对象的所有属性和方法,都会被构造函数的实例继承。
这意味着,我们可以把那些不变的属性和方法,直接定义在prototype对象上。

function User(userName, userRole) {

    this.userName = userName;

    this.userRole = userRole;

    this.userId = getGuid();

}

User.prototype.getUserByid = function (userId) {

    var result = new User(userId);

    return result;

};

var user1 = new User("root", "administrator");

var user2 = new User("admin", "administrator");

alert(user1.getUserByid === user2.getUserByid); /**********************************/true

 

为了配合prototype属性,Javascript定义了一些辅助方法,帮助我们使用它。

isPrototypeOf()  方法用来判断,某个proptotype对象和某个实例之间的关系。

 

alert(User.prototype.isPrototypeOf(user1)); //true

alert(User.prototype.isPrototypeOf(user2)); //true

 

hasOwnProperty()   每个实例对象都有一个hasOwnProperty()方法,用来判断某一个属性到底是本地属性,还是继承自prototype对象的属性。

 

alert(user1.hasOwnProperty("userName")); // true
alert(user1.hasOwnProperty("getUserByid")); // false

 

in运算符可以用来判断,某个实例是否含有某个属性,不管是不是本地属性。

 

alert("userName" in user1); // true

alert("getUserByid" in user1); // true

 

in运算符还可以用来遍历某个对象的所有属性。

 

for (var prop in user1) {

    alert("user1[" + prop + "]=" + user1[prop]);

}

js面向对象编程(一) 封装

标签:

原文地址:http://www.cnblogs.com/yuantao333/p/4627488.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!