js面向对象知识点之对象属性 创建对象 总结中
昨天面试出了一道面试题 本人我做错了 于是痛定思痛 再过一遍面向对象
- var name="一体机";
- var value="infolist";
- //构造函数
- function Anbay(){
- this.name="安备";
- this.value="anbay";
- }
- //原型
- Anbay.prototype.show=function(message){
- alert(this.name);
- alert(message);
- }
- //对象
- var dbbackup={
- name:"迪备",
- value:"dbbackup"
- }
- //实例
- var anbay=new Anbay()
- anbay.show(this.value)//"安备" ,"infolist"
- 这里的this.value相当于window.value,构造函数被调用构造函数里面的this指向实例
- anbay.show(dbbackup.value)//"安备","dbbackup"
- 这里的value是dbbackup里面的自然不用说,构造函数的作用域没有改变this.name弹出构造函数里面的dbbackup
- anbay.show.call(dbbackup,this.value)//"迪备","infolist"
- 这里的构造函数在对象dbbackup中执行,对象dbbackup拥有了所有的属性和方法
以下为个人测试得到的一些结果和数据
对理解面向对象很有用
1、属性类型 分为数据属性、访问属性
a.定义一个数据属性
- /*var person={
- } //属性所在的对象,属性的名字,和一个描述符对象
- Object.defineProperty(person,"name",{
- writable:false,
- value:"Ewarm"
- })
- alert(person.name)
- delete person.name
- alert(person.name)
- var person={
- } //属性所在的对象,属性的名字,和一个描述符对象
- Object.defineProperty(person,"name",{
- enumerable:true,
- value:"Ewarm"
- })
- var person={}
- Object.defineProperty(person,"name",{
- configurable:false,
- value:"Ewarm"
- })
- delete person.name
- alert(person.name)//弹出Ewarm
- Object.defineProperty(person,"name",{
- configurable:true,
- value:"Ewarm"
- })//抛出错误 不能被定义
- Object.defineProperty(person,"name",{
- writable:true,
- value:"cch"
- })
- person.name="cch"
- alert(person.name)
b.定义一个访问属性
//访问器属性常用设置方式,即设置一个属性值会导致其他属性发生变化
- var book={
- _year:'2017',
- edition:1
- };
- Object.defineProperty(book,"year",{
- get:function(){//get 读取
- return this._year;
- },
- set:function(newValue){ //set 写入
- if(newValue>2017){
- this._year=newValue;
- this.edition+=newValue-2017
- }
- }
- })
- book.year=2018;
- alert(book.edition)
- alert(book._year)
//c.定义访问器的旧方法
- var book={
- _year:'2017',
- edition:1
- }
- book.__defineGetter__("year",function(){
- return this._year
- })
- book.__defineSetter__("year",function(newValue){
- if(newValue>2017){
- this._year=newValue;
- this.edition+=newValue-2017
- }
- })
- book.year=2018
- alert(book.edition)//
//d.定义多个属性
- var book={}
- Object.defineProperties(book,{
- _year:{
- writable:true,
- value:2017
- },
- edition:{
- writable:true,
- value:1
- },
- year:{
- get:function(){
- return this._year;
- },
- set:function(newValue){
- if(newValue>2017){
- this._year=newValue;
- this.edition+=newValue-2017
- }
- }
- }
- })
- var descriptor=Object.getOwnPropertyDescriptor(book,"_year");//数据属性
- alert(descriptor.value)
- alert(descriptor.configurable)//用Object.defineProperties 这种configure默认为 false
- alert(descriptor.enumerable)
- alert(typeof descriptor.get);
- var descriptor=Object.getOwnPropertyDescriptor(book,"year");
- alert(descriptor.value);
- alert(descriptor.enumerable);
- alert(typeof descriptor.get);
2.创建对象
//a.工厂模式
- function createPerson(name,age,job){
- var o=new Object();
- o.name=name;
- o.age=age;
- o.job=job;
- o.sayName=function(){
- alert(this.name)
- }
- return
- }
- var person1=createPerson("Ewarm",18,"software Engineer")
- var person2=createPerson("CCH",18,"doctor")
//b.构造函数
- function Person(name,age,job){
- this.name=name;
- this.age=age;
- this.sayName=function(){
- alert(this.name)
- }
- }
- var person1=new Person()
- var person2=new Person()
- var person=new Person("Ewarm",18,"software Engineer")
//1.当构造函数调用
- person.sayName()
- Person("Greg",27,"Doctor");
//2.当普通函数调用
- window.sayName()
//3.在另一个对象的作用域中调用
- var o =new Object()
- var o={
- character:"smart",
- name:"Ew",
- age:25,
- job:"Nurse"
- }
- console.log(o)
- Person.call(o,"cch",18,"nurse")//就是说这个构造函数 在o里面执行并且o里面的该有还是有 调用之后 之前的会被覆盖 没有的会被加上在o里面
- o.sayName()
- console.log(o)
//4.原型模式
- function Person(){
- }
- Person.prototype.name="Ewarm";
- Person.prototype.age="29";
- Person.prototype.job="software Engineer";
- Person.prototype.sayName=function(){
- alert(this.name);
- }
- var person1=new Person()
- //我们可以通过isPrototypeOf()方法来确定对象之间是否存在这种关系,即实例.__proto__是否指向构造函数的原型对象,如果指向那么这个方法返回为ture。
- alert(Person.prototype.isPrototypeOf(person1))//true
- //ECMAScript5增加了一个新方法 Object.getPrototype() 这个方法返回的是实例.__proto__的值,即构造函数原型对象
- alert(Object.getPrototype(person1)==Person.prototype)//emmmm 我用的谷歌 报错了 说是支持可以实现了但没实现
注意:当我们要读取某个对象的某个属性时,都会执行一次搜索,目标是具有给定名字的属性。搜索首先从对象实例开始 问:你有没有我要的东西。如果有返回该属性的值。
如果没有继续往下面查找继续搜索指针指向的原型对象,在原型对那个中查找具有指定名字的属性,如果有返回该属性,如此一直到顶层Object。prototype,还没有返回undefine
原型有好多小细节 使用原型继承存在问题 但有解决的方法 这里我们先只说创建对象这一块
//5.组合使用构造函数和原型模式
//6.动态原型模式
//7.寄生构造函数模式
//8.稳妥构造函数模式
js面向对象知识点之对象属性 创建对象 总结中的更多相关文章
- 页面循环绑定(变量污染问题),js面向对象编程(对象属性增删改查),js字符串操作,js数组操作
页面循环绑定(变量污染问题) var lis = document.querySelectorAll(".ul li") for ( var i = 0 ; i < lis. ...
- JS面向对象编程,对象,属性,方法。
document.write('<script type="text/javascript" src="http://api.map.baidu.com/api?v ...
- JS面向对象系列教程 — 对象的基本操作
面向对象概述  面向对象(Object Oriented)简称OO,它是一种编程思维,用于指导我们如何应对各种复杂的开发场景. 这里说的对象(Object),意思就是事物,在面向对象的思维中,它将一 ...
- JS面向对象编程:对象
一般面向过程的写法都是写很多function,坏处:1.代码复用不好 2.函数名称容易重复冲突 下面介绍面向对象的写法: 在JS中每个函数function都是一个对象. 比如,下面这个就是一个对象,我 ...
- JS的从理解对象到创建对象
JavaScript不是一门真正的面向对象语言,因为它连最基本的类的概念都没有,因此它的对象和基于类的语言中的对象也会有所不同.ECMA-262把对象定义为:“无序属性的集合,其属性可以包含基本值.对 ...
- js之oop <二> 对象属性
js中对象属性可以动态添加和删除.删除对象属性用delete关键字. function obj(){ } var oo = new obj(); oo.a = "a"; oo.b ...
- JavaScript之面向对象的概念,对象属性和对象属性的特性简介
一.大家都知道,面向对象语言有一个标志,那就是他们都有类的概念,通过类我们可以创建任意多个具有相同属性和方法的对象.但ECMAScript(指定JavaScript标准的机构,也就是说JavaScri ...
- 原来JS是这样的 - 对象属性
引子 在上一篇(原来JS是这样的 (2))刚发布的时候就阅读了那篇文章的人可能会注意到那篇曾用过"JavaScript 中万物皆对象"的说法,而在随后我发现错误后立即更新改掉了这个 ...
- JS delete 用法(删除对象属性及变量)
1,对象属性删除 function fun(){ this.name = 'mm'; } var obj = new fun(); console.log(obj.name);//mm delete ...
随机推荐
- Servlet知识点大纲
这是我整理的Servlet知识点大纲,可按照它的顺序来学习-..具体的内容在我的博客中都可以找到!
- 时间效率:最小的K个数
输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. import java.util.ArrayList; import jav ...
- 简单CSS 布局
CSS Layout CSS Layout 是对上下左右布局的一个简单封装,主要针对自己项目里面方便使用. 坚持组合大于继承的原则,复杂的布局也是由简单布局组成的. 所以不习惯margin/paddi ...
- 关于使用git和github的一点点感想
第二篇博客 首先附上我的第一个java程序github地址: https://github.com/KingsC123456/FirstJavaHello 其次是关于我的github介绍,因为一直使用 ...
- spring依赖注入中接口的问题
问题描述:一个接口,有俩个实现类当注入时候名字不同时,会出现不同的情况 action层: @Controller("userAction") @Scope("protot ...
- 深入理解计算机系统chapter3
栈在处理过程调用中起到至关重要的作用,栈向下增长,栈顶元素的地址是所有栈中元素最小的.栈指针%esp保存着栈顶元素的地址 控制: 重点: 基于条件数据传送的代码比基于条件控制转移(预测错误惩罚比较高) ...
- JS -- Variables As Properties
Variables As Properties When you declare a global JavaScript variable, what you are actually doing i ...
- Spring Boot Document Part II(下)
Part II. Getting started 11. 开发第一个Spirng Boot Application使用Spring Boot的关键特征开发一个基于JAVA Web的“Hello Wor ...
- 分享基于分布式Http长连接框架--架构模型
我画了个简单的架构图来帮助说明: 其实为发布订阅架构模式. 生产者和消费者我们统一可理解为客户端,消息中间件可认为是服务端. 生产者和消费者做为客户端要跟服务端交互,则先通过代理订阅服务端,订阅成功后 ...
- 再起航,我的学习笔记之JavaScript设计模式28(委托模式)
## 委托模式 ### 概念介绍 **委托模式(Entrust): **多个对象接收并处理同一请求,他们将请求委托给另一个对象统一处理请求. ### 利用委托优化循环 如果我们有一个需求需要让用户点击 ...