浅谈js中的oop

估计很多做前端被面试的同学总会被问到会不会oop开发,有些人一下蒙蔽了,什么oop。如果面试官说面向对象,或许你一下就明了了。

这个问题包含几个细节,

  第一个是逼格(😄 )。

     第二个是对象。

         js中有六种数据类型,包括五种基本数据类型(Number,String,Boolean,Null,Undefined),和一种混合数据类型(Object)。

         既然是面向对象,那肯定是要有对象的( 😢 );

        对象既有字面量对象和new 实例化对象;        

        

var obj={
        name:"weijueye",
        sayName:function(){
            alert("姓名"+this.name+";性别"+this.sex);
        },
        sex:'men'
    }
obj.sayName();
//或者
var obj2={};
obj2.name='weijueye';
obj2.sayNmae=function(){
    alert("姓名"+this.name+";性别"+this.sex);
}
obj2.sex='男';
obj2.sayNmae();
//或者
//1. value:值,默认是undefined

//2. writable:是否是只读property,默认是false,有点像C#中的const

//3. enumerable:是否可以被枚举(for in),默认false

//4. configurable:是否可以被删除,默认false
var obj3={}
Object.defineProperties(obj3, {
    'name': {
        value: 'weijueye',
        writable: true,
        enumerable: true,
        configurable: true
    },
    sayName:{
        value:function () {
            alert("姓名"+this.name+";性别"+this.sex);
        },
        writable:false,
        configurable: false
    },
    'sex': {
        value: 'men',
        writable: false,
        enumerable: false,
        configurable: false
    }
});
obj3.sayName();

// 或者利用函数直接返回一个函数
function Person(name,sex) {
    return {
        name:name,
        sayName:function(){
            alert("姓名"+this.name+";性别"+this.sex);
        },
        sex:sex
    }
}
Person('weijueye','men').sayName();

//实例化对象
function Person(name,sex) {
    var firstName='liu';
    this.name=name;
    this.sex=sex;
}
Person.prototype.sayName=function(){
    alert("姓名"+this.name+";性别"+this.sex);
};
new Person('weijueye','men').sayName();

//在es6中终于可以用梦寐以求的类
class Person {
    //构造函数
    constructor(name,sex){
        var firstName='liu';
        this.name=firstName+name;
        this.sex=sex;
    }
    //属性
    sayName(){
        setTimeout(()=>{
            alert("姓名"+this.name+";性别"+this.sex);
        }, 1000);
    }
}
var person = new Person('weijueye','men')
person.sayName();

 

面向对象开发的好处,减少全局变量污染;多人开发适用模块开发如 CMD下的seajs和AMD下requirejs,

区别是cmd按需加载(个人推荐)amd是预加载

//  AMD:

define(["./a", "./b"], function(a, b) {
  //BEGIN
  if (true) {
    a.doSomething();
  } else {
b.doSomething();
  }
  //END
});

//  CMD:

define(function(require) {
   // BEGIN
  if(some_condition) {
    require('./a').doSomething();
  } else {
    require('./b').soSomething();
  }
  // END
});
posted @ 2017-05-10 16:58  炜爵爷  阅读(1141)  评论(0编辑  收藏  举报