javascript面向对象——面向对象基础

本文深入探讨JavaScript中的对象创建、公有方法、私有方法及特权方法的特点与使用技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对象:
对象是javascript的基础,实际上javascript语言中的一切都是对象,在最根本的层面上,对象作为属性的集合存在。
例如下面的两个实例:
var myfile = new Object();
myfile.name = 'zhang';
myfile.click = function(){
alert(My name is zhang);
}
myfile.click();
下面的代码与上面的代码是等效的:
var myfile = {
name : 'zhang',
click : function(){
alert("My name is zhang");
}
}
myfile.click();
上面的这两段代码是等效的,其实对象就是这么简单,但是,让事情变的越来越复杂的地方是,在于新对象(尤其是那些继承其它对象属性的对象)的创建。
对象创建:
不像很多其它面向对象的语言,javascript实际上并没有类也就是class的概念,在php中就会比较明显,在其他的面向对象的语言中,我们可以初始化一个特定的类的实例,但是在javascript中的情况却是这样的,在javascript中,对像能够创建新的对象,对象可以继承自其他对象,整个概念被称为"prototype inheritance"(原型标本继承),我们将会在下面的方法中有更多的论述。
我们现在来创建一个相当简单的对象代码如下:
function user(name){
this.name = name;
}
var myUser = new myfile('zhang');
alert(myUser.name);	//zhang
上面的这种处理方式是正常的,但是如果我们像下面这样处理呢!?
function user(name){
this.name = name;
}
user('zhang');
这个时候的this应该是指向谁呢!?我们知道任何没有指定上下文的函数、对象、属性等皆是指向window的。所有上面代码 user('zhang'); 它其实就是window的属性。
function user(name){
this.name = name;
}
user('zhang');
alert(window.name);	//zhang
只有将它进行实例化的时候this才是指向那个被var定义的对象上,否则this指向的永远都是window。
constructor构造函数属性:
其实构造函数属性,我们已经专门用了一章的篇幅讲解过,这里我们就不详细的讲解,我们只需知道, constructor构造函数属性是存在于每一个对象中的,它指向的总是创建该对象的那个函数。
如果有兴趣的化可以看看我对constructor构造函数讲解的这一章
创建对象——公有方法:
提到公有方法我们不得不提到"prototype"原型属性。公有方法可以完全地被对象的上下文的最终者访问。prototype简单的包含了一个对象,为一个父对象的所有新副本充当对基类的引用,本质上,prototype的任何属性对该对象的所有每一个实例对象都是可用的。
function User(name,age){
    this.name = name;
    this.age = age;
}
User.prototype.getName = function(){
    return this.name;
}
User.prototype.getAge = function(){
    return this.age;
}
var user = new User('zhang',44);
console.info(User.prototype);
console.info(user.__proto__);
alert(user.getName());	//zhang
我们看看上面 console.info(User.prototype); console.info(user.__proto__); 两段代码会在控制台上输出什么?如下图:

我们发现这两段代码所输出的结果是一样的,new出来的实例化对象所继承的完全是原型对象的属性,所以也就是 alert(user.getName()); 弹出的结果为 zhang
注意公有方法的特性:
1、公有方法是可以在对象的外部被调用的。
2、公有方法是不能够访问对象的私有属性。
3、公有方法必须在类的内部或者外部通过对象的prototype属性添加。
私有方法:
私有方法的书写方式:
function myClass(){
	var attribute = value;
	function attribute (){
		var attribute2 = function(){}
	}
}
私有方法:私有方法本身是可以访问对象内部的所有属性的,即私有属性和公有属性,但是私有方法数不可以在对象的外部被调用。后面我会翻译出国外的一些比较权威的讲解私有方法这一部分。
特权方法:
“特权方法比较特殊”,它是用来称呼那种能够观察和维护私有变量而又可以作为一种公有方法被用户访问的方法。
特权方法特性:
1、特权方法是可以在对象的外部被调用的。
2、它不仅可以在对象外部被调用,而且它还可以访问对象的私有属性,以及私有方法,并且也可以访问对象的公有属性等。
3、我们可以理解特权方法是一种比较特殊的公有方法,但是它跟公有方法又有所不同,不同的嗲房主要有方法的声明与定义不同,特权方法必须是在对象的内部声明定义。
特权方法的书写方式:
function myClass(){
	this.attribute = function(){};
}
特权方法的实例代码如下:
function myfile(){
	function name(){	//创建了一个私有方法
		alert(this.name);
	};
	this.showName = function(){	//创建一个特权方法
		name();	//特权方法访问函数内部的私有方法
	};
};
myfile.prototype.setName = function(set){	//定义一个公有方法
	name = set;
};
var myName = new myfile();	//new 一个myfile的实例对象
myName.setName("zhang");	//实例化对象调用公有方法,并传递参数
myName.showName();	//zhang
这里使用创建了一个特权方法,很好的被外部访问,这里的关键是特权方法不仅可以访问公共方法还可以访问内部的私有方法,从而很好的被外部调用,这里我们可以用外部方法传入参数。
现在我们在倒回来说说枚举一个私有方法的实例:
function myfile(){
    var name = "zhang";	//定义一个私有属性
    function showName(){		//定义一个私有方法
        alert(name);
    };
    showName();	//在函数内部运行这个私有方法
};
showName();	//报错,说这个方法是没有被定义的。
myfile.showName();		//依然会报同样的错误。
var myName = new myfile();	//我们实例化一个对象,然后在调用看看结果。
myName.showName();	//同样还是会报错。
myfile();	//zhang
从运行上面的实例我们可以看出如果我们可以看出如果只是简单的运行myfile这个函数的时候是不会报错,因为直接运行这个函数的话,是不存在调用showName()这个方法的情况,但是如果我们想要调用myfile函数中的私有方法showName的话只要是在外部,无论上述的那种做法都是会报错,所以这个时候就会出现了一种特权方法,也就是上面介绍的方法。
注意:特权方法是一种动态生成的方法,因为它是在运行的时候被给予赋值的而不是代码初次编译时添加给对象的。
总结:对面向对象中的公有方法,私有方法、特权方法这三种方法进行一下总结。
公有方法:就是通过对构造函数进行实例化,而这个实例化的对象是完全继承这个构造函数中的方法或属性,但是我们要明确的是当我们在创建了构造函数的同时原型对象也就相继被创建了,而这个原型对象就保存了所有共同使用的方法及属性。
私有方法:其实私有方法就是不能被外部调用,如果想要调用私有方法通过特权方法现在内部调用私有方法,然后在外部调用特权方法。
特权方法:特权方法如果简单的理解的话就相当于连接两岸的桥梁,如果仔细分析特权方法的运行机制的话牵扯的知识就会比较多,我会在后续的博文中陆续推出,大致就是 闭包的原理,以及作用域链,变量对象,以及比较重要的this指向问题。
如有理解不当之处,欢迎各位老铁留言指正。谢谢!!!!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值