js类的基础寄义
我们晓得,在js
中,是没有类的观点的。类的一切实例对象都从同一个原型对象上继续属性,因而,原型对象
是类的中心。
类是对象的笼统,而对象是类的详细实例。类是笼统的,不占用内存,而对象是详细的,占用存储空间。———百度百科
初期的javascript
需求都很简朴,基础都是写成函数的,然后是面向历程的写法,厥后逐步的引入面向对象开辟头脑,再厥后就逐步写成 类
。
在js
中,写成类的实质基础都是 组织函数+原型
。下面,就讨论一下js类的几种写法:
组织函数 法
/**
* Person类:定义一个人,有name属性和getName要领
*/
<script>
function Person(name){
this.name = name;
this.getName = function(){
return this.name;
}
}
//我们在这里实例化几个对象
var p1 = new Person("trigkit4");
var p2 = new Person("mike");
console.log(p1 instanceof Person);//true
console.log(p2 instanceof Person);//true
</script>
由上面控制台输出效果可知,p1和p2的确是类Person
的实例对象。instanceof
操作符左侧是待检测类的对象,右侧是定义类的组织函数。这里,instanceof
用来检测对象p1
是不是属于Person
类。
这类体式格局的长处是:我们能够依据参数来组织差别的对象实例 ,瑕玷是每次组织实例对象时都邑天生getName
要领,形成了内存的糟蹋 。
我们能够用一个外部函数来替代类要领,达到了每一个对象同享同一个要领。改写后的类以下:
//外部函数
<script>
function getName() {
return this.name;
}
function Person(name){
this.name = name;
this.getName = getName;//
}
</script>
原型体式格局
<script>
function Person(){};
Person.prototype.name = "trigkit4";//类的属性都放在prototype上
Person.prototype.getName = function(){
return " I'm " + this.name;
}
var p1 = new Person();
var p2 = new Person();
console.log(p1.name);//trigkit4
console.log(p2.getName());//I'm trigkit4
</script>
原型体式格局
的瑕玷就是不能通过参数来组织对象实例 (平常每一个对象的属性是不相同的) ,长处是一切对象实例都同享getName
要领(相对于组织函数体式格局),没有形成内存糟蹋 。
组织函数+原型体式格局
取前面两种的长处:
a、用组织函数来定义类属性(字段)。
b、用原型体式格局来定义类的要领。
<script>
function Person(name){
this.name = name;
}
//原型的特征能够让对象实例同享getName要领
Person.prototype.getName = function(){
return " I'm " + this.name;
}
</script>
如许,我们就既能够组织差别属性的对象,也能够让对象实例同享要领,不会形成内存的糟蹋。
为了让js
代码作风更紧凑,我们让prototype
要领代码移到function Person
的大括号内。
<script>
function Person(name){
this.name = name;
Person.prototype.getName = function(){
return name;//不宜用this.name
}
}
var p1 = new Person('trigkit4');
console.log(p1.getName());//trigkit4
</script>
在这里,我们须要晓得的几种定义类的要领,除了上面的组织函数外,另有:
Object.create()要领
用这个要领,"类"
就是一个对象,而不是函数。
var Person = {
name : "trigkit4",
age : 21,
run: function(){
alert("I like running");
}
}
然后,直接用Object.create()
天生实例,不须要用到new。
var p1 = Object.create(Person);
alert(p1.age);//21
p1.run();//I like running
这类要领比”组织函数法
“简朴,然则不能实现私有属性和私有要领,实例对象之间也不能同享数据,对”类”的模仿不够周全。
createNew()要领
这类要领不须要用到this和prototype
,其做法是用对象来模仿一个类,然后在类内里定义一个组织函数createNew()
,然后在createNew()内里定义实例对象,把这个实例对象作为返回值。
<script>
var Person = {
createNew : function () {
var person = {};
person.name = "trigkit4";
person.run = function(){
alert("I like running");
};
return person;
}
}
</script>
运用的时刻,挪用createNew()
要领,就能够获得实例对象。
var p1 = Person.createNew();
p1.run();//I like running
这类写法实在和对象字面量的写法是很相似的,只不过一个是逗号分开,一个是分号分开。