JS ——面向对象

对象定义的三种方式

(1)使用Object声明对象

var obj1 = new Object();

(2)可以使用直接量

var  obj2 = {}

(3)可以由其本身和其原型构成

var obj3 = Object.create({});

定义对象

(1)直接定义对象
var obj1 = {
    name:"李四",
    age:19
};
(2)追加定义对象
obj1.name="张三";
obj1.age="20";
(3)覆盖定义对象
obj1 = {
    height:"178cm",
    hobby:function(){
        console.log("喜欢篮球")
    }
}

传值和传址

传值

var a=10;
var b=a;
b=5;

传址

传址:对象赋值去相同的内存地址
复杂的数据类型传址

var obj={
    a:10
}
var obj2 = obj;
obj2.a = 5;
console.log(obj)

一些ES6写法

ES6 定义对象

var :只有一层作用域
let :在作用域内有效,
const :定义常量

{//不再是一个单纯对象
    let a=10;
    var b=15;
    console.log(a,b)
}
console.log(a) //undefind
console.log(b) //15

const PI = "3.1419265897";
console.log(PI);
const PI = "3.1415926"; //重复定义常量会报错

模板字符串

ES5写法

    let str ="姓名是"+name+"年龄是18";
    console.log(str);

ES6写法

let str = `姓名是${name},年龄是18岁`;
console.log(str);

对象写法

var name = "库里";
var pwd = "123456"

es5写法

var obj ={
    name:name
}   

es6写法

var obj={
    name,
    pwd//键名,键值一样可以写成一个
}

es5写法

var dog = {
    name:"小黑",
    sex:"male",
    action:function(){;
        console.log("吃、撒欢、叫")
    }
}

es6写法

var dog = {
    name:"小黑",
    sex:"male",
    action(){;
        console.log("吃、撒欢、叫")
    }
}

匿名函数

es5 写法

var test1 = function(str){//传参
    return str; 
}
var test2 = function(){//无参数
    var str = "你好";
    return str;
}

es6写法 :箭头函数

var test1 = (str) => str//传参函数
var test2 =() =>{ //无参函数
    var str = "你好";
    return str;
}

注:对象的写法和匿名函数的写法很像

var test = () =>({
    name:"历史",
    age:"18"
})//对象要加上(),不加,系统无法分清是作用域还是对象,会报错
console.log(test());

this 穿透

var obj = {
    name:"李四",
    age:"18",
//  action:function(){
//      console.log(this)
//  }
    //箭头函数写法:(this穿透)
    action:()=>{
        console.log(this)
    }
}

工厂模式

工厂模式:避免变量污染

function Factory(height){
    //obj 类
    var obj= {};
    obj.name = "张三";
    obj.height = height;
    obj.age="14";
    obj.hobby = function(){
        console.log("我喜欢游戏");
    }
    return obj;
}
var newFactory =    Factory("179cm")
console.log(newFactory.height);
newFactory.hobby();

构造函数: (取代工厂函数)(类似于类的概念)

function Dog(name,sex){
    this.name=name;
    this.sex=sex;
    this.action = function(){
         console.log("叫、跑、吃")
    }
}

调用构造函数
实例化 关键字 :new(吧抽象类具体化,吧类变成对象)

var ahuan= new Dog("阿欢","公");
ahuan.action();
console.log(ahuan.name)
var xiaohei = new Dog("小黑","母")

new 预定义:做了三件事
1、创建一个空对象
2、改变this指向
3、赋值原型;(构造函数原型赋给对象类型)

改变this指向:call、apply、bind

function test(name,age){
    console.log(name,age)
    console.log(this)
}
var obj = {
    name:"张三",
    age:19
}
// this 指向的都是obj
test.call(obj,"李四",20);
test.apply(obj,["王五",18]);//数组传参
test.bind(obj)("马六",20)

构造函数的原型;
对象是由自身和原型共同构成的;对象的原型是proto
构造函数是由自身和原型共同构成的;构造函数的原型prototype
属性写在构造函数里;方法写在原型上

function Person(name,sex,age,height){
            this.name=name;
            this.sex = sex;
            this.age = age;
            this.height = height;
        }

Person.prototype.action = function(){
            console.log(this)
            console.log("跑步")
        }
        Person.prototype.hobby = function(){
            console.log("姓名是"+this.name)//实例化是谁就是谁
            console.log("喜欢游戏")
        }
        
        Person.prototype = function(){
            action:function(){
                console.log("跑步")
            }
        }
        var lisi = new Person("李四","man",18,"180cm")
        lisi.action();
        lisi.hobby()

类的特性:封装、继承、多肽、重载;

封装

function Person(name){
    //私有属性;
    var name= name;
    //公有属性
    this.height = "186cm";
    //get方法,通过公有方法访问私有属性
    this.get = function(){
        return name;
    }
    //set方法:设置私有属性;
    this.set = function(Newname){
        name = Newname;
        console.log(Newname)
    }
}
var newPerson = new Person("张三");
console.log(newPerson.get())
newPerson.set("凯基")

继承

function Human(sex,height){
    this.sex=sex;
    this.live = "活着";
    this.height = height;
    this.action = function(){
        console.log("衣食住行");
    }
}
Human.prototype.hobby= function(){
    console.log("喜欢足球")
}
function Student(sex,height){
    Human.call(this,sex,height);
    this.active = function(){
        console.log("学习")
    }
}
var newStudent = new Student("man","180cm");
newStudent.action();// 衣食住行
newStudent.hobby();// 喜欢足球
会涉及传址问题
Student.prototype = Human.prototype;
解决传址问题
function Link(){}//另起一个空间
Link.prototype = Human.prototype;
Student.prototype = new Link();
//重写子集的方法会影响父集
Student.prototype.hobby = function(){
    console.log("喜欢下棋")
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容

  • title: js面向对象date: 2017年8月17日 18:58:05updated: 2017年8月27日...
    lu900618阅读 559评论 0 2
  • 一、面向过程和面向对象的区别、联系 1.面向过程编程:注重解决问题的步骤,分析问题需要的每一步,实现函数依次调用。...
    空谷悠阅读 895评论 1 11
  • 正所谓万物皆对象,面向对象也是很多编程语言里常谈的问题,接下来我们来了解一下js的面向对象。 一、定义对象的三种方...
    马大哈tt阅读 549评论 0 2
  • 学过C++等语言的话,你一定明白面向对象的两个基本概念: 类:类是对象的类型模板,例如,定义Student类来表示...
    Beatrice7阅读 752评论 0 0
  • 苗天华:龙哥,你可以带着吴凌云去你的地盘吗?我跟吴凌云的班级仅仅半天就被瓜分了,现在不能回去。 我呆滞地盯着苗天华...
    浮生万梦星耀烛天阅读 229评论 0 1