美文网首页
面向对象

面向对象

作者: 贞贞姐 | 来源:发表于2019-06-13 15:18 被阅读0次

一、三种创建对象的方式

// 字面量
var per1 ={
      name: ' kkkk ',
      age: ' 49 ',
      eat: function () {
             console.log( " 11 " )
     }
}
// 系统构造函数
var per2 = new object();
per2.name = "  jhdejg ";
per2.age =30;
per.eat = function () {
      console.log( " 22 " )
}
// 自定义构造函数
function Person (name,age,sex) {
     this.name = name;
     this.age = age;
     this.sex= sex;
     this.eat = function() {
           console.log( " 22 " )
     }
}
var per = new Person( "zhenzi",33,"女" );
// new : 开辟空间存储对象,把this设置当前对象,设置属性和方法的值,把this对象返回
// 工厂模式
function gonghang(name,age,sex) {
     var obj = new object();
     obj .name = name;
     obj .age = age;
     obj .sex= sex;
     obj .eat = function() {
           console.log( " 22 " )
     }
     return obj;
}
var per = Person( "zhenzi2",33,"女" );
// 工厂模式和自定义构造函数的对比
/*
共同点:都是函数,都可以创建对象,都可以传入参数
不同点:
工厂模式:函数名是小写,有new,有返回值,new之后的对象是当前对象,直接调用函数就可以创建对象
自定义构造函数:函数名是首字母是大写,没有new,没有返回值,this是当前对象,通过new的方式来创建对象
*/

二、构造函数和实例对象的关系

function Person (name,age,sex) {
     this.name = name;
     this.age = age;
     this.sex= sex;
     this.eat = function() {
           console.log( " 22 " )
     }
}
var per = new Person( "zhenzi",33,"女" );
console.dir( per )是把这个对象的结构显示出来
// 判断这个对象是不是这种数据类型,下面代码打印出来是true
1: console.log( per.constructor == Person )
2: console.log( per instanceof  Person )
总结:实例对象和构造函数之间的关系:
1:实例对象是通过构造函数来创建的,创建的过程叫做实例化
2:如何判断对象是不是这个数据类型?
    1):通过构造器的方式,实例对象.构造器 == 构造器的名字
    2)对象 instanceof 构造函数名字
尽量使用第二种方式来识别

三、原型
作用:数据共享,节省内存空间

function Person (name,age,sex) {
     this.name = name;
     this.age = age;
     this.sex= sex;
}
// 通过原型添加方法
Person.prototype.eat = function() {
     console.log( " 22 " )
}
var p1 = new Person( " 小明", 33 )
var p2 = new Person( " 小", 22 )
console.log( p1.eat === p2.eat )  // true
console.log( p1)
console.log(Person)

console.log( p1)
console.log(Person)打印出来结果如下


image.png
image.png

四、面向对象
初级:

function ChageStyle ( btnId,dvId,color ) {
    this.btnobj = document.getElementById( btnId) ; // 对象
    this.dvobj = document.getElementById( dvId) ; // 对象
    this.color=color ; 
}
// 数据共享来改变颜色
ChageStyle .prorotype.init = fuction () {
    console.log( this ); // this就是实例对象
   
}
// 实例化对象
var  cs = new ChageStyle (' btn ',' dv ',  ' red');
cs.init();

// 进阶

function ChageStyle ( btnobj,dvobj ,json) {
    this.btnobj = btnobj  
    this.dvobj = dvobj 
    this.json=json; 
}
// 数据共享来改变颜色
ChageStyle .prorotype.init = fuction () {
    var that = this;
    this.btnobj .onclick = function() {
        for( var k in that.json  ){
            that.dvobj.style[ k ] = that.json[ k ];
        }
    }
}
// 实例化对象
var json = {
    " width":"500px";
    " height":"500px";
    " color":"red";
};
var  cs = new ChageStyle (document.getElementById('btnid'),document.getElementById("idv"),  json );
cs.init();

结论:
实例对象中有一个属性proto,也是对象,叫原型,不是标准的属性,浏览器使用的
构造函数中有一个属性prototype,也是对象,叫原型,是标准的属性,程序员使用的
实例对象使用的属性或者方法,先在实例中查找,找到了直接使用。找不到则去实例对象的proto指向的原型对象prototype中找,找到了则直接使用,找不到则报错
五、局部变量变成全局变量

// 函数自调用
(function(win){
   // win是形参,window是实参
   var num = 10;
   win.num = num // 暴露到全局
})(window)
console.log(num) // 10
(function(win){
     // win是形参,window是实参
      function Person(){ }
    Person.prototype.init= function(){
        return Math.floor(Math.random()*5);
       }
       window.ss = new Person();
})(window)
console.log(ss.init())

六、原型继承

// 动物的构造函数
function Anomal(name,weight) {
     this,name = name;
     this.weight = weight;
}
// 动物的原型方法
Anomal.prototype.eat = funciton(){
   console.log("天天吃");
}
// 狗的构造函数
function Dog(color){
    this.color = color;
}
Dog.prototype = new Anomal("哮天犬","50k");

Dog.prototype.bitePerson = function(){
    console.log("汪汪汪")
}

function ErHa(sex){
    this.sex= sex;
}
ErHa.prototype = new Dog("黑白色");
ErHa.prototype.playHost = function(){
    console.log("哈哈,好玩")
}
var ErHa = new ErHa("雄性");
ErHa.eat()
ErHa.bitePerson();
ErHa.playHost();

apply和call方法中如果没有传入参数,或者是传入null,那么调用该方法的函数对象中的this就是默认的window
apply (对象,【参数】);
call(对象,参数1,参数2,参数3.。。。)
函数名字:bind(对象,参数1,参数2,参数3.。。。),返回值是复制之后的这个函数
方法名字:bind(对象,参数1,参数2,参数3.。。。)返回值是复制之后的这个方法
apply可以改变this的指向
apply和call是调用的时候改变this指向,bind是赋值了一份的时候改变this指向,案例如下

function f1(x,y){
   console.log((x+y)+":=========>"+this.age);
// this是下边的per
}
function Person(){
     this.age = 1000;
}
Person.prototype.eat = function(){
    console.log("这个是吃")
}
var per = new Person();
var ff = f1.bind( per ,10,20);
ff();

bind的应用

function ShowRandom(){
  // 1-10的随机数,没有加1就是1-9
   this.number = parseInt(Math.random()*10+1)
}
// 添加原型方法
ShowRandom.prototype.show1 = function(){
// 改变了定时器的this指向,本来应该是window,现在是实例对象
 window.setInterval(this.show2.bind(this),1000)
}
// 添加原型的方法
ShowRandom.prototype.show2 = function(){
// 显示随机数
   console.log(this.number)
}
// 实例对象
var per = new ShowRandom()
per .show2();

七、函数作为参数

function f1(fn){
    fn();// fn当成一个函数来使用,fn是传参,最后当做函数使用,函数是可以作为参数使用
}
// 匿名函数
f1(function(){
   console.log("我是匿名函数")
})
// 命名函数
function f2(){
   console.log("f2的函数")
}
f1(f2)
// 函数作为参数的时候,如果是命名函数,那么只传命名函数的名字,没有括号
image.png

// 定时器里调用

function f1(fn){
    setInterval(function(){
        console.log("定时器开始");
        fn();
        console.log("定时器结束");
    })
}
// f1传了一个函数作为参数来调用
f1(function(){
    console.log("好困啊,好累啊啦啦啦");
})

函数作为返回值

function f1(){
   console.log("f1函数开始")
   return function(){
       console.log("我是函数,但是此时是作为返回值使用的");
   } 
}
var ff = f1();
ff();
image.png

七、浅拷贝和深拷贝
浅拷贝

深拷贝

相关文章

  • PHP全栈学习笔记8

    面向对象的基本概念,面向对象编程,oop,面向对象,面向对象的分析,面向对象的设计,面向对象的编程,什么是类。 类...

  • PHP全栈学习笔记8

    面向对象的基本概念,面向对象编程,oop,面向对象,面向对象的分析,面向对象的设计,面向对象的编程,什么是类。 类...

  • 总结.Net基础知识——献给即将入坑的同行们(一期)

    什么是面向对象 面向对象OO = 面向对象的分析OOA + 面向对象的设计OOD + 面向对象的编程OOP; 通俗...

  • 面向对象基础

    面向对象编程包括: 面向对象的分析(OOA) 面向对象的设计(OOD) 面向对象的编程实现(OOP) 面向对象思想...

  • 20-OOP类与对象

    面向对象 Object Oriented 学习面向对象:XXOO 面向对象的学习: 面向过程和面向对象的区别: 面...

  • JavaScript面向对象核心知识归纳

    面向对象 概念 面向对象就是使用对象。面向对象开发就是使用对象开发。 面向过程就是用过程的方式进行开发。面向对象是...

  • 面向对象(未完成)

    面向对象 标签(空格分隔): 面向对象 第一章:面向对象(上) 什么叫面向对象 面向过程、面向对象、两者区别 构造...

  • 面向对象:创建对象&继承

    博客内容:什么是面向对象为什么要面向对象面向对象编程的特性和原则理解对象属性创建对象继承 什么是面向对象 面向对象...

  • 面向对象

    了解什么是面向对象 首先,我们学习面向对象,要了解什么是面向对象,面向对象的重要概念:类,对象。 面向对象提出的这...

  • 面向对象的三大基本特征和五大设计原则

    1、面向对象概念 1.1、理解面向对象 面向对象是相对面向过程而言; 面向对象和面向过程都是一种思想; 面向过程:...

网友评论

      本文标题:面向对象

      本文链接:https://www.haomeiwen.com/subject/runtiqtx.html