1.OOP 指什么?有哪些特性
- OOP:Object-oriented programming,缩写OOP,即面向对象程序设计,其中两个最重要的概念就是类和对象。类只是具备了某些功能和属性的抽象模型,而实际应用中需要一个一个实体,也就是需要对类进行实例化,类在实例化之后就是对象。
对象:将类实例化
实例化:就是将类实现的过程
目的:
1.改善可读性
2.提高重用性原则:开放封闭原则
1.开放:对模块进行扩展
2.封闭:不必改动模块的源代码
- 特性:三要素继承,封装,多态
1.继承性:子类自动继承其父级类中的属性和方法,并可以添加新的属性和方法或者对部分属性和方法进行重写。继承增加了代码的可重用性。
2.多态性:子类继承了来自父级类中的属性和方法,并对其中部分方法进行重写。
3.封装性:将一个类的使用和实现分开,只保留部分接口和方法与外部联系。
2.如何通过构造函数的方式创建一个拥有属性和方法的对象?
var Animal = function(){
this.name = '动物'
}//构造函数
Animal.prototype.say =function(){
console.log(this.name+'叫')
}
var animal = new Animal()//实例化,得到一个对象
animal.say()
3. prototype 是什么?有什么特性
function定义的对象有一个prototype属性,prototype属性又指向了一个prototype对象,注意prototype属性与prototype对象是两个不同的东西,要注意区别。在prototype对象中又有一个constructor属性,这个constructor属性同样指向一个constructor对象,而这个constructor对象恰恰就是这个function函数本身。
这个prototype到底有什么作用呢?看下面的例子:
function obj1(){}
obj1.prototype.name = "zyn";
var test = new obj1();
console.log(test.name)// zyn
奇怪吧,明明没有为test设置name属性,可是为什么会有值?
这就是prototype的功劳了,prototype属性中的name对象,在new构造函数之后,被继承到了对象test的属性中。接着看:
var name = "js";
function obj2(name){
console.log(this.name);//css
}
obj2.prototype.name = "css";
var test = new obj2();
console.log(test.name)//css
第一步是建立一个新对象(test)。
第二步将该对象(test)内置的原型对象设置为构造函数prototype 属性引用的那个原型对象。
第三步就是将该对象(test)作为this 参数调用构造函数,完成成员设置等初始化工作。
其中第二步中出现了一个新名词就是内置的原型对象,注意这个新名词跟prototype对象不是一回事, 为了区别我叫它inobj,inobj就指向了函数的prototype对象。在prototype对象中出现的任何属性或者函数都可以在test对象中直接使用,这个就是JS中的原型继承了。
通常,这样创建一个对象:
function person(name){
this.name = name
this.sayHi = function(){
console.log('Hi' +' '+ this.name)
}
}
var z= new person('zyn')
z.sayHi()//Hi zyn
以上,使用new关键字,通过对象(函数也是特殊对象)创建一个对象实例。
在基于类的语言中,属性或字段通常都是在类中事先定义好了,但在Javascript中,在创建对象之后还可以为类添加字段。
var Animal =function(){}
var cat = new Animal();
cat.color = "green";
以上,color这个字段只属于当前的cat实例。
对于后加的字段,如果想让animal的所有实例都拥有呢?
使用prototype
var Animal =function(){}
Animal.prototype.color= "green";
var cat = new Animal();
var dog = new Animal();
console.log(cat.color);//green
console.log(dog.color);//green
通过Prototype不仅可以添加字段,还可以添加方法。
var Animal =function(){}
Animal.prototype.color= "green";
var cat = new Animal();
var dog = new Animal();
console.log(cat.color);//green
console.log(dog.color);//green
Animal.prototype.run= function(){
console.log("run")
}
dog.run();
原来通过prototype属性,在创建对象之后还可以改变对象的行为。
比如,可以为数组这个特殊对象添加一个方法。
Array.prototype.remove = function(elem){//elem=2
var index = this.indexOf(elem);//index=1
if(index >= 0){
this.splice(index, 1);
}
}
var arr = [1, 2, 3] ;
arr.remove(2);
//原数组变为arr[1,3]
除了通过prototype为对象定义属性或方法,还可以通过对象的构造函数来定义类的属性或方法。
var Animal = function(){
this.color = "green";
this.run = function(){
console.log("run");
}
}
var mouse = new Animal();
mouse.run();
以上做法的也可以让所有的Animal实例共享所有的字段和方法。并且还有一个好处是可以在构造函数中使用类的局部变量。
var Animal = function (){
var runAlready = false;
this.color = "green";
this.run = function(){
if(!runAlreadh){
console.log("start running");
} else {
console.log("already running")
}
}
}
其实,一个更加实际的做法是把通过构造函数结合通过prototype定义一个类的字段和行为。
ar Animal = function (){
var runAlready = false;
this.color = "green";
this.run = function(){
if(!runAlready){
console.log("start running");
} else {
console.log("already running")
}
}
}
Animal.prototype.color = '';
Animal.prototype.hide = function(){
console.log("111");
}
var horse = new Animal();
horse.run(); //start running
horse.hide();//111
Prototype允许我们在创建对象之后来改变对象或类的行为,并且这些通过prototype属性添加的字段或方法所有对象实例是共享的。
4.画出如下代码的原型图
function People (name){
this.name = name;
this.sayName = function(){
console.log('my name is:' + this.name);
}
}
People.prototype.walk = function(){
console.log(this.name + ' is walking');
}
var p1 = new People('zyn');
var p2 = new People('JL');
5. 创建一个 Car 对象,拥有属性name、color、status;拥有方法run,stop,getStatus
var Car = function(name,color,status){
this.name =name;
this.color =color;
this.status = status;
}
Car.prototype.run =function(){
console.log('running')
}
Car.prototype.stop =function(){
console.log('stop')
}
Car.prototype.getStatus =function(){
console.log(this.status)
}
var Ben = new Car ('Ben','black',120)
6.创建一个 GoTop 对象,当 new 一个 GotTop 对象则会在页面上创建一个回到顶部的元素,点击页面滚动到顶部。
//主要代码
var GoTop = function(ct,target){
this.ct = ct;
this.target = $('<div class="goTop">回到顶部</div>')
this.target.css({
position:'fixed',
right:'100px',
bottom:'50px',
display:'none',
padding:'8px',
cursor:'pointer',
border:'1px solid',
borderRadius:'4px'
})
}
GoTop.prototype.creatNode = function(){
this.ct.append(this.target);
}
GoTop.prototype.bindEvent = function(){
var _this = this;
var $window = $(window);
$window.on('scroll',function(){
var $top = $window.scrollTop()
if($top>100){
_this.target.css('display','block')
}else{
_this.target.css('display','none')
}
})
this.target.on('click',function(){
_this.ct.animate({
scrollTop : 0
})
})
}
var Gotop =new GoTop($('body'))
Gotop.creatNode();
Gotop.bindEvent();
效果
希望对给位朋友有所帮助~~
版权归饥人谷--楠柒所有如有转发请注明出处 谢谢~~